十八万字吐血整理的C/C++、嵌入式常见面试题!!!!

欢迎订阅,希望能点个赞!!!!

正在持续更新!!!!!欢迎探讨!!!

完整专栏地址:https://blog.nowcoder.net/zhuanlan/gmPWX0


相关知识点都能零星在网上找到,这个文章系列将目前遇到的所有常见面试问题进行一个汇总。

文中很多资料避免不了从网上或是其他复习资料里收集整理,十分感谢前辈的辛勤付出,如果存在侵权请一定联系我进行删除

也有相当一部分是本人在经历提前批以及秋招的过程中遇到和验证过的。


系列文章PDF下载地址:《最全C_C++及嵌入式软开面试题宝典.pdf》



56、类什么时候会析构?

1.对象生命周期结束,被销毁时;

2.delete指向对象的指针时,或delete指向对象的基类类型指针,而其基类虚构函数是虚函数时;

3.对象i是对象o的成员,o的析构函数被调用时,对象i的析构函数也被调用。

57、为什么友元函数必须在类内部声明?

因为编译器必须能够读取这个结构的声明以理解这个数据类型的大小、行为等方面的所有规则。有一条规则在任何关系中都很重要,那就是谁可以访问我的私有部分。

58、C++ ⾯向对象的三⼤特征是:封装、继承、多态。

1、所谓封装

就是把客观事物封装成抽象的类,并且类可以把⾃⼰的数据和⽅法只让信任的类或者对象操作,对不可信的进⾏信息隐藏。

⼀个类就是⼀个封装了数据以及操作这些数据的代码的逻辑实体。在⼀个对象内部,某些代码或某些数据可以是私有的,不能被外界访问。通过这种⽅式,对象对内部数据提供了不同级别的保护,以防⽌程序中⽆关的部分意外的改变或错误的使⽤了对象的私有部分。

2、所谓继承

是指可以让某个类型的对象获得另⼀个类型的对象的属性的⽅法。它⽀持按级分类的概念。继承是指这样⼀种能⼒:它可以使⽤现有类的所有功能,并在⽆需重新编写原来的类的情况下对这些功能进⾏扩展。通过继承创建的新类称为“⼦类”或者“派⽣类”,被继承的类称为“基类”、“⽗类”或“超类”。继承的过程,就是从⼀般到特殊的过程。要实现继承,可以通过“继承”和“组合”来实现。

继承概念的实现⽅式有两类:

实现继承:实现继承是指直接使⽤基类的属性和⽅法⽽⽆需额外编码的能⼒。

接⼝继承:接⼝继承是指仅使⽤属性和⽅法的名称、但是⼦类必需提供实现的能⼒。

3、所谓多态

就是向不同的对象发送同⼀个消息,不同对象在接收时会产⽣不同的⾏为(即⽅法)。即⼀个接⼝,可以实现多种⽅法。

多态与⾮多态的实质区别就是函数地址是静态绑定还是动态绑定的。如果函数的调⽤,在编译器编译期间就可以确定函数的调⽤地址,并产⽣代码,则是静态绑定。⽽如果函数调⽤的地址不能在编译器期间确定,需要在运⾏时才确定,这就属于动态绑定。

59、介绍一下C++里面的多态?

多态可以分为静态多态(重载,模板)和动态多态(覆盖,虚函数实现)。

lsy注:关于静态多态,可以看看C++primer这本书,大概在536页左右。

1、静态多态其实就是重载,因为静态多态是指在编译时期决定调⽤哪个函数,根据参数列表来决定。基本原理是,编译器为函数⽣成符号表时的不同规则,重载只是⼀种语⾔特性,与多态⽆关,与⾯向对象也⽆关,但这⼜是 C++中增加的新规则。

当编译器遇到一个模板定义时,它并不生成代码。只有当实例化出模板的一个特定版本时,编译器才会生成代码。

2、动态多态是指通过⼦类重写⽗类的虚函数来实现的,因为是在运⾏期间决定调⽤的函数,所以称为动态多态。函数的运行版本由实参决定,在运行时选择函数的版本,所以称为动态绑定。执行动态绑定,即运行基类指针指向派生类的对象,并调用派生类的函数。

⼀般情况下我们不区分这两个时所说的多态就是指动态多态。

3、动态多态的实现与虚函数表,虚函数指针相关。

虚函数实现原理:虚函数表(存在对象的栈上或堆上)->虚函数指针(常量区)->虚函数(代码区)

纯虚函数: virtual int fun() = 0;

扩展:⼦类是否要重写⽗类的虚函数?⼦类继承⽗类时, ⽗类的纯虚函数必须重写,否则⼦类也是⼀个虚类,不可实例化。定义纯虚函数是为了实现⼀个接⼝,起到⼀个规范的作⽤,规范继承这个类的程序员必须实现这个函数。

60、C++ 中重载和重写,重定义的区别

1、重载

翻译⾃overload,是指同⼀可访问区内被声明的⼏个具有不同参数列表的同名函数,依赖于C++函数名字的修饰会将参数加在后⾯,可以是参数类型,个数,顺序的不同。根据参数列表决定调⽤哪个函数,重载不关⼼函数的返回类型。

2、重写

重写翻译⾃override,也叫覆盖。子类重新定义父类中有相同名称和参数的虚函数(virtual)。在继承关系之间。C++利用虚函数实现多态。

重写的特点:

1)被重写的函数不能是static的。必须是virtual的

2)重写函数必须有相同的类型,名称和参数列表

3)重写函数的访问修饰符可以不同。尽管父类的virtual方法是private的,派生类中重写改写为public,protected也是可以的。

3、重定义(隐藏)

派⽣类重新定义⽗类中相同名字的⾮ virtual 函数,参数列表和返回类型都可以不同,即⽗类中除了定义成 virtual 且完全相同的同名函数才不会被派⽣类中的同名函数所隐藏(重定义),否则就是重写了(重写与重定义的区别)。