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; }