图图工作3年啦,期间面过很多企业,因为问题特别基础,但是呢,又容易忘记专业的词语来解释,因此,准备做一个整理文档,欢迎给建议哦!
(一)new、delete、malloc、free的关系?
(1)new和delete是C++运算符,都可以申请动态内存和释放内存,对象创建的时候自动执行构造函数,消亡之前自动执行析构函数;malloc和free是库函数,无法满足动态对象需求;
(2)new操作符是从自由存储区上为对象动态分配内存空间,对象可以用成员函数访问不要直接访问它的地址空间;malloc函数从堆上动态分配内存,用指针访问,可以在里面移动指针;
(3)new可以自动计算类型的大小,返回对应类型的指针;malloc需要手动计算类型大小且返回类型为void*
(5)new可以被重载;
(6)new分配内存失败时,会抛出bac_alloc异常,不会返回NULL; malloc分配内存失败时会返回NULL;
(二)c++的性质有哪些?
封装、继承、多态
(1)封装:可以隐藏自己属性和方法、仅对外提供接口、
(2)继承:可以扩展已存在的代码、实现代码重用、
(3)多态:一个接口、多种方法、实现接口重用、
(三)多态是怎么实现的?
【1】你理解的多态
多态的实现主要分为:静态多态和动态多态
静态多态主要是重载,在编译的时候已经确定;
动态多态是用虚函数机制实现的,在运行期间动态绑定;
多态实现的条件:
a:子类继承父类
b:子类重写父类方法
c:父类引用指向子类对象 Father A = new son();
多态实现的原理:
当父类的引用指向子类对象时,由于程序调用方法是在运行期才动态绑定的,那么引用变量所指向的具体实例对象在运行期才确定,所以这个对象的方法是在运行期正在内存运行的这个对象的方法而不是引用变量的类型中定义的方法。
即虚函数实现:
定义一个基类的指针,指向其一个继承类,当通过基类的指针去调用函数时,可以在运行时决定该调用基类的函数还是继承类的函数,
(四)虚函数系列
【1】虚函数的作用?
虚函数的作用是实现多态性,多态性是将接口与实现进行分离
【2】构造函数可以是虚函数吗?内联函数、静态成员函数可以是虚函数吗
都不可以,编译不会通过
1)虚函数是通过虚表指针和虚函数表实现的,虚表指针存于对象的内存布局中,即先有对象才能调用虚函数,而构造函数是来构造对象的,构造函数使得对象从无到有,如果存在虚构造函数,试问,一个对象还没有构造出来,如何调用虚函数?
2)内联函数需要在编译阶段展开,而虚函数是运行时动态绑定,编译时无法展开
3)静态成员函数是以类为单位的函数,与具体对象无关;
【3】析构函数可以是虚函数吗?而默认析构函数呢?
1)析构函数必须是虚函数
将可能被继承的父类的析构函数设置为虚函数,可以保证当我们new一个子类,然后使用基类指针指向该子类对象,释放基类指针可以释放掉子类的的空间,防止内存泄漏;
2)默认的析构函数不是虚汗
虚函数需要额外的虚函数表和虚表指针,占用额外的内存,而对于不会被继承的类来说,
【4】虚函数的实现
虚函数的实现:在有虚函数的类中,类的最开始部分是一个虚函数表的指针,这个指针指向一个虚函数表,表中放了虚函数的地址,实际的虚函数在代码段中;
当子类继承了父类的时候也会继承其虚函数表,当子类重写父类中虚函数的时候,会将其继承到虚函数表中的地址替换为重新写的函数地址,是用来虚函数,会增加访问内存开销,降低效率。
【5】简述C++虚函数作用以及底层实现原理
主要是答虚函表和虚表指针的作用;
虚函数是使用虚函数表和虚函数表指针实现,虚函数表一个类的虚函数的地址表,用于索引类本身以及父类的虚函数的地址,加入子类的虚函数重写了父类的虚函数,则对应在虚函数表中会把对应的虚函数替换为子类的虚函数地址;
虚函数表指针存在于每个对象中,它指向对象所在类的虚函数表的地址,在多继承的环境下,会存在多个虚函数表指针,分别指向对应不同基类的虚函数表。
【6】一个对象访问普通成员函数和虚函数哪个更快?
访问普通成员函数更快,因为普通成员函数的地址在编译阶段就已经确定,因此在访问时,直接调用对应地址的函数;
虚函数在调用时,需要在虚函数表中寻找虚函数所在地址,因此相比普通成员函数慢点;
(五)内存分布
1、栈区
2、堆区
3、全局数据区
4、代码区
(六)static用法
c语言的用法
(一)静态局部变量:
- 用于函数体内修饰,在全局数据区分配内存;
- 编译器自动对其初始化;
- 作用域为局部作用域,当定义它的函数结束时,其作用域也随之结束,
(二)静态全局变量:
- 定义在函数体外,用于修饰全局变量,该变量在本文件中可见;
(三)静态函数:
- 与静态全局变量作用类似,不能被其它文件调用;
- 其它文件可以定义相同名字的函数,不会发生冲突;
c++的用法
除了以上3种,c++中还有额外两种用法
(一)类的静态数据成员:
总结
1、隐藏
2、持久
3、
参考文献
https://blog.csdn.net/linux_ever/article/details/51056169
https://blog.csdn.net/xiaoan08133192/article/details/107123879