您的位置:首页 > 编程语言 > C语言/C++

C++面试题

2016-09-21 21:16 162 查看
01 引用和指针的区别
相同点:都是地址的概念;指针存储对象的地址,引用时内存块的别名。
不同点:
1)指针式实体,引用时别名。
2)指针需要解引用(*),引用不需要解引用。
2)指针初始化后,可以反复修改。引用只能初始化一次,不能修改。
3)const可以修饰指针,表示常指针,即指针指向的对象地址不可以修改,但此对象的值可变。const不能修改引用。
4)sizeof(指针)表示指针变量的大小。sizeof(引用)表示引用对象的大小


02 new/delete,malloc/free的区别
相同点:用于内存管理。
不同点:
1) 函数和运算符的区别
malloc/free是C语言函数,new/delete是C++运算符。因此编译器不能把对象的构造函数和析构函数调用强加于malloc/free函数。
2)功能差异
mallo分配指定大小的内存块,free释放指定大小的内存块。
new/delete,可以管理自定义对象的内存分配。
new对象时,先分配内存空间,紧接着调用构造函数
delete对象时,先调用析构函数,然后释放内存空间。

注:new/delete表示创建和删除单一对象;
new[]/delete[]表示创建和删除对象数组;


03 继承类的析构函数/构造函数的调用顺序
场景1:创建继承类
[基类构造函数]->[派生类构造函数]
场景2:释放继承类
[派生类析构函数]->[基类析构函数]


04 重写[覆盖] 和 重载的区别
场景1:重写[覆盖]
子类重写父类的方法。需要满足以下特性
1)重写函数的函数名,函数入参,返回值都必须和父类是一样的。
2)访问权限必须大于父类

场景2:重载
函数名相同,而入参不同(可以是入参的数量,类型等不同)

注:函数名一定是相同的。入参部分一定是有差异的,可能是参数个数不同,也可能是参数类型不同)

类的多态:理解为父类的同一个接口,在子类中有不同的具体实现(或自身类有函数重载)


05 虚函数,纯虚函数,普通函数
场景:类继承
1)普通函数
父类的普通函数,理解为提供给子类的强制实现,可以被调用。
2) 虚函数
父类实现的虚函数,提供给子类的默认接口实现。此时,子类可以重写(覆盖)此接口,实现接口自定义划
3)纯虚函数
基类为纯虚类,不提供默认接口实现,理解为“接口继承”。子类可做接口自定义化实现。

注:C++的虚函数提供"运行是多态"。基类虚函数,提供子类的默认接口实现。子类可以重写父类的接口,实现接口自定义实现。


06 结构体和联合体的区别
相同点:多可以存储多种不同类型的变量
不同点:
联合体:多种不同类型的变量,共同占用一块内存。内存为最大的变量所占的长度。当对其操作时,会覆盖之前的内存块中写入的变量值。
结构体:多种不同类型的数据集合。内存为变量的所占的内存总和。
当对其操作具体变量时,只影响此变量所在的内存空间,不会影响其他的变量。


07 C++是不是类型安全的
不是。两个不同类型的指针可以进行强制转换(reinterpret cast)。C#是类型安全的。


08 数组和指针的区别
1)功能
数组存储多个同类型的对象。指针存储对象的地址
2)内存分配
数组可以分配在堆上(全局数组对象),栈上(局部变量)
指针可以指向任何的内存地址。
3)sizeof(数组),得到数组的所占内存大小。
sizeof(指针),得到指针自身的所占内存大小。

ex:
char a[] = "12345";
int  nSize = sizeof(a);  // nSize = 6;
char *b  = a;
nSize = sizeof(b);       // nSize = 4;

int fun(char c[10])
{
int nSize = sizeof(c);  // 注意:nSize = 4;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++