C++面试基础知识复习系列—五

1、extern关键字。表明变量或者函数的定义在别得文件中,提示此编译器遇到此变量或者函数时在其他模块寻找定义。

1>假定a.h中定义了 int a=10;b.cpp与c.cpp同时include "a.h",则编译不成功,因为a重复定义;

2>假定a.h中有static int a=10;则可以,因为b.cpp与c.cpp中的a仅仅是名字相同,地址空间不同;

3>假定a.h中有extern int a;在b.cpp或者c.cpp中有int a=10;则b.cpp与c.cpp中的a指向同一个地址空间。

2、静态多态与动态多态。

动态多态设计思想:对于相关的对象类型,确定他们之间的一个共同功能集合,然后在基类中,把这些共同的函数声明为多个公共的虚函数接口。各个子类重写这些虚函数,以完成具体的功能。客户端的代码通过指向基类的引用或指针来操作这些对象,对虚函数的调用会自动绑定到实际提供的子类对象上去。

静态多态设计思想:对于相关的对象类型,直接实现它们各自的定义,不需要共有基类,甚至可以没有任何关系。只需要各个具体类的实现中要求共同的接口声明。模板实现。

3、虚函数表。https://blog.csdn.net/haoel/article/details/1948051/

注意:虚函数表示针对类的。编译器为每一个类维持一个虚函数表,每个对象的首地址保存着该虚函数表的指针。同一个类的不同对象世界上指向同一张虚函数表。

4、

  • 纯虚函数如何定义,为什么对于存在虚函数的类中析构函数要定义成虚函数?
  • answer:
  • 如果基类的析构函数不是虚函数,在delete p时,调用析构函数时,只会看指针的数据类型,而不会去看赋值的对象,这样就会造成内存泄露。假定p是指向基类的对象指针,那么delete p仅仅会调用基类的析构函数。
  • 析构函数能抛出异常吗?
  • answer:
  • 1、如果析构函数抛出异常,则异常之后的程序不会执行,如果析构函数在异常点之后要执行某些必要的动作比如释放某些资源,则这些动作不会被执行,会造成诸如资源泄露的问题。
  • 2、通常异常发生时,C++的机制会调用已经构造对象的析构函数来释放资源,若此时析构韩束本省也抛出异常,则前一个异常尚未处理,又有新的异常,会造成诸如资源泄露的问题。
  • 构造函数和析构函数中调用虚函数吗?
  • 不能。当创建某个派生类的对象时,如果在它的基类的构造函数中调用虚函数,那么此时派生类的构造函数并未执行,所调用的函数可能操作还未被初始化的成员,可能会导致灾难的发生;
  • 析构函数是用来销毁一个对象的,在销毁一个对象时,先调用该对象所属类的析构函数,再调用基类的析构函数。调用完派生类的析构函数之后,派生类对象已经被清理干净了。再调用基类的析构函数又会转向调用派生类的构造函数,此时的调用无意义。
  • 指针和引用的区别
  • 指针与数组千丝万缕的联系

智能指针是怎么实现的?什么时候改变引用计数

5、内存对齐的原则。

1>结构体成员按自身长度自对齐。所谓自对齐指的是该成员变量起始位置的内存地址必须是它自身长度的整数倍。

2>结构体的总大小为结构体的有效对齐值的整数倍

有效对齐值的确定:

1>未明确指定时,以结构体中的最长的成员的长度为其有效值;

2>用#pragma pack(n)指定时,以n与结构体中最长的成员的长度的最小值为其对齐值;

3>当用__attribute__ ((__packed__))指定长度时,强制按照此值为结构体的有效对齐值。

6、内联函数与宏定义。

1、内联函数在运行时可调试,而宏定义不可以;

2、编译器会对内联函数的参数类型做类型检查或自动类型转换(同普通函数),宏定义不会;

3、内联函数可以访问类的成员变量,宏不可以;

4、在类中声明同时定义的成员函数,自动转化为内联函数。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值