C++面试5题--4day
C++ 析构函数可以抛出异常吗?
从实践上讲,C++析构函数不应该抛出异常。虽然语法上允许,但这是一种非常危险的行为,因为如果在异常处理的栈展开过程中,一个析构函数也抛出了异常,程序会因为无法处理两个同时存在的异常而直接调用 std::terminate
终止,导致资源无法正常释放。因此,最佳实践是在析构函数内部捕获并处理所有可能发生的异常,绝不能让其泄露到函数外部。
讲讲你是如何理解C++的深拷贝与浅拷贝的?
我对深拷贝和浅拷贝的理解是,它们处理类中指针成员时的不同拷贝方式。浅拷贝仅仅是复制指针的地址值,这会导致多个对象共享同一份内存资源,当其中一个对象析构并释放该内存后,其他对象的指针就会变成悬挂指针,再次释放时就会导致程序崩溃。而深拷贝则会为新对象重新分配一块独立的内存,并将原始对象所指向的内容完整复制过来,从而确保每个对象都拥有自己独立的资源,互不影响,保证了程序的安全性和稳定性。
C++ 多态的实现方式是什么?
C++的多态主要通过两种方式实现:静态多态和动态多态。静态多态是在编译期就决定的,主要通过函数重载和模板来实现,效率高。动态多态则是在程序运行时决定的,它依赖于继承、虚函数和基类指针或引用。其核心实现机制是虚函数表(vtable)和虚指针(vptr),每个包含虚函数的对象都有一个vptr指向其类的vtable,程序在运行时通过vptr查找vtable,从而调用到对象实际类型的那个虚函数版本。
C++ this指针是什么?能做什么?
this
指针是C++非静态成员函数中的一个隐含的常量指针,它指向调用该成员函数的对象本身。它的主要作用有三个:一是在成员变量和函数参数同名时用于区分,明确访问成员变量;二是通过返回*this
的引用来实现链式调用,让代码更简洁;三是在成员函数内部需要将当前对象本身传递给其他函数时,可以直接使用this
指针。
C++ 虚函数表是什么?
虚函数表,即vtable,是C++实现动态多态的核心数据结构。它是一个属于类的静态数组,里面存放着该类所有虚函数的地址。每个包含虚函数的对象实例,其内部都会有一个隐藏的虚指针(vptr),这个指针在对象构造时会指向其所属类的虚函数表。当通过基类指针调用虚函数时,系统就是通过这个对象的vptr找到正确的vtable,再从表中找到对应函数的地址并执行调用,从而实现了在运行时根据对象的实际类型来动态绑定函数。