C++面试题

 

1.什么是虚函数? 虚函数在父类中有函数体,也允许由子类重写,用virtual修饰,引入虚函数是为了实现动态绑定 非类成员函数不能是虚函数 静态函数不能是虚函数 构造函数不能是虚函数 内联函数不能是表现多态时的虚函数

2.什么是纯虚函数? 纯虚函数在父类中无函数体,只能由子类重写,不能被直接调用 含有纯虚函数的类叫抽象类,不能直接创建对象

3.虚函数的实现机制? 虚函数表在程序的只读数据段,存放虚函数指针,如果派生类实现了基类的某个虚函数,则在虚表中覆盖对应的指针

3.C++的多态? C++的多态与Java的多态定义相同:多态是指表面相同的东西,其实有不同特性。多态分为编译时多态和运行时多态。 编译时多态指函数重载、运算符重载、类模版、函数模版。 运行时多态指函数重写,由虚函数、纯虚函数支持。

3.子类析构时会调用父类的析构函数吗? 会。创建时,先调用父类的构造函数、再子类;销毁时相反。

4.基类的析构函数为什么要是虚函数? 为了利用基类的指针指向派生类对象、删除派生类对象,否则派生类的析构函数不会被调用,造成内存泄漏

4.new/delete的作用? new调用构造函数,delete调用析构函数,用于为自定义数据结构动态申请和释放内存 new/delete是运算符

5.malloc/free的作用? 用于为内部数据结构动态申请和释放内存 由于malloc/free是库函数,不在编译器控制权限之内,因此不能执行构造函数和析构函数

6.delete[]的作用? 当delete作用于数组时,它为每个数组元素调用析构函数,并释放内存

8.引用和指针的区别? 引用必须初始化,指针不必 引用不能改变作用的对象,指针可以改变所指的对象 引用不能作用于空值,指针可以指向空值

8.值传递、引用传递、指针参数的区别? 值传递时参与函数运算的是副本,原本的变量不改变;副本需要分配内存,所以效率低 引用传递时参与函数运算的是原本的变量 指针传递的效果与引用传递的效果是一样的,缺点是使用麻烦、可读性差、参与函数运算的是指针的副本

9.引用作为返回值? 类型标识符 &函数名 (形参) {函数体} 不能返回局部变量的引用 不能返回new对象的引用

10.结构体struct与联合体union的区别? 结构体中的所有成员同时存在,占有不同的空间;联合体中的所有成员共享一块空间,任一时刻只有一个成员有值 对结构体的成员赋值,不影响其它成员;对联合体的成员赋值,其它成员会变成未定义状态 union默认为public,可以有构造函数、析构函数,不能有引用类型的成员,不能继承或被继承,不能含有虚函数,全局匿名union必须是static的

18.struct和class有什么区别? struct是数据结构的实现体,成员默认是public的 class是对象的实现体,成员默认是private的

11.C++是不是类型安全的?

12.C++的内存模型?

13.const的5种用法? 修饰常量 修饰指向常量的指针,const int* a = b,b是常量,a是指向b的指针 修饰自身为常量的指针,int* const a = b,a是指向b的指针,且不可变 修饰常量的引用,const int &a = b,b是常量,a是b的引用;void fun (const int& var),既避免了拷贝,也防止函数内对var修改 修饰成员函数,int fun () const,函数体内不能修改成员变量

14.static的4种用法? 修饰全局变量,会改变变量的存储区域和生命周期,存在静态区,main函数执行前就分配了空间 修饰全局函数,改变函数的作用范围,仅在定义该函数的文件内才能使用 修饰成员变量,不需要生成对象就能访问该成员,且所有对象的成员都是同一个 修饰成员函数,不需要生成对象就能访问该成员

15.什么是内联函数? 相当于把内联函数的函数体复制到调用点,不用执行进入函数的步骤(比如创建栈帧、压栈等),直接执行 以代码膨胀为代价,消除函数调用带来的开销 是否内敛,程序员不可控;inline只是对编译器的建议,决定权在编译器 类内定义的函数,只要不是虚函数,都是隐式内联 类外定义的函数,要用inline显式内联

16.volatile的作用是什么? volatile修饰的变量,每次访问都必须从内存中取值 不用volatile修饰的话,可能由于编译器的优化,从CPU的寄存器中取值

17.指针a指向一个数组,sizeof(a)能得到数组的大小吗? 不能。如果a是数组的引用,则可以

19.friend的作用? 在类内声明函数并用friend修饰,在类外定义函数,函数体内可以访问类的私有成员 在类A内声明类B并用friend修饰,在类A外定义类B,B中的所有函数都可以访问A中的私有成员

20.模版的作用? 模版是泛型编程的基础,泛型编程是以一种独立于任何特定类型的方式编写代码 函数模版:template T fun () {} 类模版:template class C {}