C++校招面经(二)
欢迎关注
0voice · GitHub
6、
C++ 和
Java
区别(语⾔特性,垃圾回收,应⽤场景等)
指针:
Java
语⾔让程序员没法找到指针来直接访问内存,没有指针的概念,并有内存的⾃动管理功能,从⽽有效的
防⽌了
C++
语⾔中的指针操作失误的影响。但并⾮
Java
中没有指针,
Java
虚拟机内部中还是⽤了指针,保证了
Java
程序的安全。
多᯿继承:
C++
⽀持多᯿继承但
Java
不⽀持,但⽀持⼀个类继承多个接⼝,实现
C++
中多᯿继承的功能,⼜避免
了
C++
的多᯿继承带来的不便。
数据类型和类:
Java
是完全⾯向对象的语⾔,所有的函数和变ᰁ必须是类的⼀部分。除了基本数据类型之外,其余
的都作为类对象,对象将数据和⽅法结合起来,把它们封装在类中,这样每个对象都可以实现⾃⼰的特点和⾏为。
Java
中取消了
C++
中的
struct
和
union
。
⾃动内存管理:
Java
程序中所有对象都是⽤
new
操作符建⽴在内存堆栈上,
Java
⾃动进⾏⽆⽤内存回收操作,不
需要程序员进⾏⼿动删除。⽽
C++
中必须由程序员释放内存资源,增加了程序设计者的负担。
Java
中当⼀个对象
不再被⽤到时, ⽆⽤内存回收器将给他们加上标签。
Java
⾥⽆⽤内存回收程序是以线程⽅式在后台运⾏的,利⽤
空闲时间⼯作来删除。
Java
不⽀持操作符᯿载。操作符᯿载被认为是
C++
的突出特性。
Java
不⽀持预处理功能。
C++
在编译过程中都有⼀个预编译阶段,
Java
没有预处理器,但它提供了
import
与
C++
预处理器具有类似功能。
类型转换:
C++
中有数据类型隐含转换的机制,
Java
中需要限时强制类型转换。
字符串:
C++
中字符串是以
Null
终⽌符代表字符串的结束,⽽
Java
的字符串 是⽤类对象(
string
和
stringBuffer
)来实现的。
Java
中不提供
goto
语句,虽然指定
goto
作为关键字,但不⽀持它的使⽤,使程序简洁易读。
Java
的异常机制⽤于捕获例外事件,增强系统容错能⼒。
7
、说⼀下
C++
⾥是怎么定义常ᰁ的?常ᰁ存放在内存的哪个位置?
对于局部常ᰁ,存放在栈区;
对于全局常ᰁ,编译期⼀般不分配内存,放在符号表中以提⾼访问效率;
字⾯值常ᰁ,⽐如字符串,放在常ᰁ区。
8
、
C++
中᯿载和᯿写,᯿定义的区别
᯿载
翻译⾃
overload
,是指同⼀可访问区内被声明的⼏个具有不同参数列表的同名函数,依赖于
C++
函数名字的修饰
会将参数加在后⾯,可以是参数类型,个数,顺序的不同。根据参数列表决定调⽤哪个函数,᯿载不关⼼函数的返
回类型。
᯿写
翻译⾃
override
,派⽣类中᯿新定义⽗类中除了函数体外完全相同的虚函数,注意被᯿写的函数不能是
static
的,
⼀定要是虚函数,且其他⼀定要完全相同。要注意,᯿写和被᯿写的函数是在不同的类当中的,᯿写函数的访问修
饰符是可以不同的,尽管
virtual
中是
private
的,派⽣类中᯿写可以改为
public
。
᯿定义(隐藏)
派⽣类᯿新定义⽗类中相同名字的⾮
virtual
函数,参数列表
和返回类型都可以不同,即⽗类中除了定义成
virtual
且完全相同的同名函数才
不会被派⽣类中的同名函数所隐藏(᯿定义)。
9
、介绍
C++
所有的构造函数
类的对象被创建时,编译系统为对象分配内存空间,并⾃动调⽤构造函数,由构造函数完成成员的初始化⼯作。
即构造函数的作⽤:初始化对象的数据成员。
⽆参数构造函数:
即默认构造函数,如果没有明确写出⽆参数构造函数,编译器会⾃动⽣成默认的⽆参数构造函
数,函数为空,什么也不做,如果不想使⽤⾃动⽣成的⽆参构造函数,必需要⾃⼰显示写出⼀个⽆参构造函数。
⼀般构造函数:
也称᯿载构造函数,⼀般构造函数可以有各种参数形式,⼀个类可以有多个⼀般构造函数,前提是
参数的个数或者类型不同,创建对象时根据传⼊参数不同调⽤不同的构造函数。
拷⻉构造函数:
拷⻉构造函数的函数参数为对象本身的引⽤,⽤于根据⼀个已存在的对象复制出⼀个新的该类的对
象,⼀般在函数中会将已存在的对象的数据成员的值⼀⼀复制到新创建的对象中。如果没有显示的写拷⻉构造函
数,则系统会默认创建⼀个拷⻉构造函数,但当类中有指针成员时,最好不要使⽤编译器提供的默认的拷⻉构造函
数,最好⾃⼰定义并且在函数中执⾏深拷⻉。
类型转换构造函数:
根据⼀个指定类型的对象创建⼀个本类的对象,也可以算是⼀般构造函数的⼀种,这⾥提出
来,是想说有的时候不允许默认转换的话,要记得将其声明为
explict
的,来阻⽌⼀些隐式转换的发⽣。
赋值运算符的᯿载
:注意,这个类似拷⻉构造函数,将=右边的本类对象的值复制给=左边的对象,它不属于构造
函数,=左右两边的对象必需已经被创建。如果没有显示的写赋值运算符的᯿载,系统也会⽣成默认的赋值运算
符,做⼀些基本的拷⻉⼯作。
10
、
C++
的四种强制转换
C++
的四种强制转换包括:
static_cast, dynamic_cast, const_cast, reinterpret_cast
static_cast
:明确指出类型转换,⼀般建议将隐式转换都替换成显示转换,因为没有动态类型检查,上⾏转换
(派⽣类
->
基类)安全,下⾏转换(基类
->
派⽣类) 不安全,所以主要执⾏⾮多态的转换操作;
dynamic_cast
:专⻔⽤于派⽣类之间的转换,
type-id
必须是类指针,类引⽤或
void*
,对于下⾏转换是安全
的,当类型不⼀致时,转换过来的是空指针,⽽
static_cast
,当类型不⼀致时,转换过来的事错误意义的指
针,可能造成⾮法访问等问题。
const_cast
:专⻔⽤于
const
属性的转换,去除
const
性质,或增加
const
性质, 是四个转换符中唯⼀⼀个
可以操作常ᰁ的转换符。
reinterpret_cast
:不到万不得已,不要使⽤这个转换符,⾼危操作。使⽤特点: 从底层对数据进⾏᯿新解
释,依赖具体的平台,可移植性差; 可以将整形转 换为指针,也可以把指针转换为数组;可以在指针和引⽤
之间进⾏肆⽆忌惮的转换。