C++研发106面试题总结(二)
--C++实现细节
linux内部提供了那些调试宏?
__FILE__:表示在哪个文件
__LINE__:表示在当前多少行
__FUNCTION__:表示在执行在哪个函数
手写线程安全的单例模式?
引用和指针的区别?
指针:是一个变量类型;指针可以不进行初始化;指针初始化后可以改变,在写代码时需要大量的检测
引用:是一个别名;引用必须要初始化;引用初始化后不可改变,无需检测
出现异常时,try和catch做了什么?
Catch(Ep a)发生异常-》建立一个异常对象-》拷贝一个异常对象-》catch处理
Catch(Ep &a)发生异常-》建立一个异常对象-》引用异常对象-》catch处理
异常对象通常建立在全局或者堆中【需要在函数外进行捕捉】
Catch捕捉异常的转换:异常处理时,如果用基类的处理派生类的对象会导致派生类完全当做基类来使用,即便有虚函数也没用,所以派生类必须放在基类前处理。
C++如何处理多个异常的?
多次catch处理
常对象的成员变量一定不可以修改吗?为什么?
可以修改,用mutable来修饰,可以突破const的限制。
虚函数的调用过程?
找到对象内存中vfptr所指向虚函数表的地址-》找到虚函数表相应的虚函数地址
汇编层面:
Mov ecx, dword ptr[ebp-0ch]将this指针放进ecx
Mov edx, dword ptr[ecx]将虚表的地址放进edx
Call dword ptr[edx+4]:调用虚表中函数
虚函数放置顺序与声明顺序一样,成员变量也是
虚表中放的不是函数的入口地址,而是一个jmp跳转指令的地址
单继承,多继承,菱形继承,虚继承时,对象内存中的差异区别?如果存在虚函数呢?
单继承:
多继承:
菱形继承: