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

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

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

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

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

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

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

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



11、mutable

1.如果需要在const成员方法中修改一个成员变量的值,那么需要将这个成员变量修饰为mutable。即用mutable修饰的成员变量不受const成员方法的限制;

2.可以认为mutable的变量是类的辅助状态,但是只是起到类的一些方面表述的功能,修改他的内容我们可以认为对象的状态本身并没有改变的。实际上由于const_cast的存在,这个概念很多时候用处不是很到了。

12、 extern用法?

作用:

1.修饰符 extern ⽤在变量或者函数的声明前,⽤来说明此变量/函数是在别处定义的,要在此处引⽤”。

2.有了#include,为啥要⽤ extern?因为⽤ extern 能够提前进行声明,会加速程序的编译过程,这样能节省时间。

用法:

1extern修饰变量的声明

如果文件a.c需要引用b.c中变量int v,就可以在a.c中声明extern int v,然后就可以引用变量v。

2extern修饰函数的声明

如果文件a.c需要引用b.c中的函数,比如在b.c中原型是int fun(int mu),那么就可以在a.c中声明extern int fun(int mu),然后就能使用fun来做任何事情。就像变量的声明一样,extern int funint mu)可以放在a.c中任何地方,而不一定非要放在a.c的文件作用域的范围中。

3extern修饰符可用于指示C或者C++函数的调用规范。

比如在C++中调用C库函数,就需要在C++程序中用extern “C”声明要引用的函数。这是给链接器用的,告诉链接器在链接的时候用C函数规范来链接。主要原因是C++和C程序编译完成后在目标代码中命名规则不同。

13、 int转字符串,字符串转int?strcat,strcpy,strncpy,memset,memcpy的内部实现?

c++11标准增加了全局函数std::to_string

可以使用std::stoi/stol/stoll等等函数

strcpy拥有返回值,有时候函数原本不需要返回值,但为了增加灵活性如支持链式表达。

14、 深拷贝与浅拷贝?

1.浅拷贝:只是拷贝了基本类型的数据,而引用类型数据,复制后也是会发生引用,我们把这种拷贝叫做(浅复制)浅拷贝,换句话说,浅复制仅仅是指向被复制的内存地址,如果原地址中对象被改变了,那么浅复制出来的对象也会相应改变。

深拷贝:在计算机中开辟了一块新的内存地址用于存放复制的对象。


2.在某些状况下,类内成员变量需要动态开辟堆内存,如果实行浅拷贝,也就是把对象里的值完全复制给另一个对象,如A=B。这时,如果B中有一个成员变量指针已经申请了内存,那A中的那个成员变量也指向同一块内存。这就出现了问题:当B把内存释放了(如:析构),这时A内的指针就是野指针了,出现运行错误。

3.深拷⻉与浅拷⻉之间的区别就在于深拷⻉会在堆内存中另外申请空间来存储数据,从⽽也就解决来野指针的问题。简⽽⾔之,当数据成员中有指针时,必需要⽤深拷⻉更加安全。

lsy注:赋值运算符重载是深拷贝还是浅拷贝?可以深拷贝也可以浅拷贝。提供了深拷贝的可能性。
15、C++模板是什么,底层怎么实现的?

1、模板是C++支持参数化多态的工具,为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型。模板是一种对类型进行参数化的工具。

2、函数模板的实例化是由编译程序处理函数调用时自动完成的;类模板的实例化是由程序员在程序中显式的指定;函数模板针对参数类型不同和返回值类型不同的函数;类模板针对数据成员、成员函数和继承的基类类型不同的类。

3、编译器会对函数模板进行两次编译:在声明的地方对模板代码本身进行编译,在对参数替换后的代码进行编译。

4、函数模板要被实例化后才能成为真正的函数,在使用函数模板的源文件中包含函数模板的头文件,如果该头文件中只有声明,没有定义,那编译器无法实例化该模板,最终导致链接错误。