C++常见面试题及答案精选

村口二丫2021-12-24 12:57

  为什么结构函数一般不定义为虚函数?而且析构函数一般写成虚函数的原因?

C++常见面试题及答案精选

  1、构造函数不能声明为虚函数。

  1)因为创建对象时需要确定对象的类型,而虚拟函数在运行时确定其类型。在构建对象时,编译器无法知道对象的实际类型,无论是类本身还是类的衍生类等。

  2)虚拟函数的调用需要虚拟函数表指针,该指针存储在对象的内存空间中;如果构造函数声明为虚拟函数,则由于对象尚未创建,且没有内存空间,因此没有虚拟函数表地址用于调用虚拟函数,即构造函数。

  2、析构函数最好声明为虚函数。

  首先,分析函数可以是虚拟函数。当分析指向衍生类的基类指针时,最好将基类的分析函数声明为虚拟函数,否则会出现内存泄漏的问题。

  如果分析函数不被声明为虚拟函数,则编译器实现静态绑定。删除指向派生类的基类指针时,只调用基类的分析函数而不调用派生类分析函数,导致派生类对象分析不完整。

  介绍静态绑定和动态绑定。

  静态绑定和动态绑定是C++多态性的特征。

  1)对象的静态类型和动态类型。

  静态类型:编译时确定对象在声明中使用的类型。

  动态类型:当前对象所指的类型在运行期内确定,对象的动态类型可变,静态类型不能改变。

  2)静态绑定和动态绑定。

  静态绑定:绑定对象的静态类型,函数依赖对象的静态类型,在编译期确定。

  动态绑定:绑定对象的动态类型,函数依赖对象的动态类型,在运行期确定。

  只有虚拟函数用动态绑定,其他都是静态绑定。

  3、引用能否实现动态绑定,为什么能实现引用?

  是的。因为引用(或指针)既可以指向基类对象,也可以指向派生类对象,这是动态绑定的关键。在运行过程中,引用(或指针)调用的虚拟函数被确定,引用(或指针)所指对象的实际类型被定义。

  4、深拷贝和浅拷贝的区别。

  深度复制和浅度复制可以简单地理解为:如果一个类拥有资源,当该类对象发生复制过程时,如果资源重新分配,则为深度复制;相反,如果没有重新分配资源,则为浅度复制。

  5、复制构造函数(三种情况构造函数(三种情况)

  系统自动生成的结构函数:普通结构函数和复制结构函数(当相应的结构函数没有定义时)

  生成一个实例化的对象会调用一个普通的构造函数,而复制构造函数用于实例化一个新对象。

  调用复制构造函数的情况:

  1)当使用类的对象初始化另一个对象时。

  2)当函数的参数是类对象时,即值传递时,如果是引用传递,则不会调用。

  当函数的返回值为类对象或引用时。

  以上就是小编为大家整理发布的“C++常见面试题及答案精选”一文,更多相关内容尽在开课吧广场C++教程频道。

免责声明:本站所提供的内容均来源于网友提供或网络搜集,由本站编辑整理,仅供个人研究、交流学习使用。如涉及版权问题,请联系本站管理员予以更改或删除。
有用
分享