目录
3.7C++,释放内存的时候 关键字delete和free有什么区别
4.4内存对齐 在定义结构体时,编译器可能会有内存对齐,介绍一下为什么会有内存对齐?
5.2标准库里的hashtable是什么容器的底层?如何实现的?hashtable怎么做扩容?
5.3使用标准库时又是会出现迭代器失效的情况,这种情况一般是怎么回事?
5.4数组和链表的区别vector和list的使场景 新增一个元素,数组和链表的区别
5.5stack适配器的底层容器是什么,能不能用vector,为什么
5.6c++的map的底层实现 红黑树Map的底层,红黑树的查询和插入的时间复杂程度,Unordermap的底层实现是什么
17.一个函数调用的过程(ESP EBP压栈这些的)new和malloc的区别?
0.简介
最近看到的面经总结往往不够深入或者不够广泛,所以我针对近期的面试题总结出来的常考问题,特别是对问题深度和广度的追问和探讨,帮助大家更能完善地应对面试,同时我也会不断进行更新,如有错误请多多指正,希望大家都能拿到理想的offer!
1.虚函数(多态)
1.1什么是多态(静态多态和动态多态)
多态的构成条件
- 必须通过基类的指针或者引用调用虚函数
- 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写(三同)
- 重写:两个函数分别在基类和派生类,并且三同(函数名,参数,返回值(协变例外));
1.2什么是虚函数什么是纯虚函数,纯虚函数的作用
语法上:
1.虚函数和纯虚函数都只能在类中通过关键字“virtual”声明,纯虚函数形参列表后接“=0”;
2.可以在一个类中同时声明虚函数和纯虚函数;
3.含有纯虚函数的类(抽象类)不能创建实例对象;
4.仅含有虚函数的类可以创建实例对象;
4.抽象类也可以实现自己的虚函数以及纯虚函数(相当于准备一份缺省的实现);
5.派生类必须覆写基类的纯虚函数,否则无法通过编译;
6.派生类可以不覆写基类的虚函数,此时默认调用到基类的缺省实现;
7.覆写了虚函数的派生类可以显示调用基类的缺省实现,否则默认调用覆写的实现;
应用上:
1.虚函数主要是为了实现运行时的多态,案例情形:A类为抽象类,虽然不能创建实例,但可以创建A类的指针,并且A类的指针可以指向其派生类的实例对象,此时再通过这个指针去调用虚函数,则会调用到对应派生类的覆写实现。
2.纯虚函数除了要实现运行时的多态,还为了“代码层“的多态,还强调了“接口继承”的特性,纯虚函数更多是为了预留一个接口,以便未来开发时派生类根据不同的需求实现该接口。
1.3虚函数的底层原理
实现原理:虚函数表+虚表指针
1.4构造函数可以是虚函数或者纯虚函数吗,析构函数呢
构造函数:
析构函数:
1.5为什么析构函数要求是虚函数
1.6静态函数能是虚函数吗,模板函数能是虚函数吗
static成员不属于任何类对象或类实例,所以即使给此函数加上virutal也是没有任何意义的。
静态与非静态成员函数之间有一个主要的区别。那就是静态成员函数没有this指针。
类模板成员函数不可以是虚函数(因为编译器无法确定存在多少虚函数)
1.7虚函数表属于类还是属于对象
- 类与虚表的关系:一个类只有一个虚表
- 对象与类的关系:所有对象共享一个虚表
1.8虚函数表在什么时候生成
编译
1.9虚表指针在什么时候生成
初始化对象
1.10协变
三同的例外
基类中返回的是基类类型的指针或引用,派生类可以重写该虚函数并返回派生类类型的指针或引用
2.C++11新特性
2.1智能指针
3.区别
3.1malloc和new 的区别
3.2指针跟引用的区别
3.3值传递和引用传递的区别
3.4堆内存和栈内存的区别? 哪些变量在栈,哪些在堆
3.5 32位系统和64位系统的区别
32位和64位系统在Windows下基本数据类型的大小都是一样的。只有指针的大小不一样!32位指针大小为4byte,而64位的指针大小为8byte。
3.6 重载 重写 隐藏的区别
3.7C++,释放内存的时候 关键字delete和free有什么区别
4.内存
4.1 内存空间分布
4.2C++虚函数表存在哪里
只读数据段
4.3虚拟内存是什么
4.4内存对齐 在定义结构体时,编译器可能会有内存对齐,介绍一下为什么会有内存对齐?
4.5malloc出来的内存是在物理内存还是虚拟内存
虚拟内存