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

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

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

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

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

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

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

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



6、静态变量什么时候初始化

1.初始化只有一次,但是可以多次赋值,在主程序之前,编译器已经为其分配好了内存(静态存储区)

2.静态局部变量和全局变量一样,数据都存放在全局区域,所以在主程序之前,编译器已经为其分配好了内存,但在CC++中静态局部变量的初始化节点又有点不太一样。在C中,初始化发生在代码执行之前,编译阶段分配好内存之后,就会进行初始化,所以我们看到在C语言中无法使用变量对静态局部变量进行初始化,在程序运行结束,变量所处的全局内存会被全部回收。

3.在C++中,初始化时在执行相关代码时才会进行初始化,主要是由于C++引入对象后,要进行初始化必须执行相应构造函数和析构函数,在构造函数或析构函数中经常会需要进行某些程序中需要进行的特定操作,并非简单地分配内存。所以C++标准定为全局或静态对象是有首次用到时才会进行构造,并通过atexit()来管理。在程序结束,按照构造顺序反方向进行逐个析构。所以在C++中是可以使用变量对静态局部变量进行初始化的。

7、const?

在C语言里,const只是声明只读属性,还是可以通过修改内存上的值进行修改,只不过这种做法是未定义的。C++里的常量是真正的常量,放在符号表里。

1.阻止一个变量被改变,可以使用const关键字。在定义该const变量时,通常需要对它进行初始化,因为以后就没有机会再去改变它了;

2.对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const

3.在一个函数声明中,const可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值;

5.对于类的成员函数,可以指定其返回值为const类型,以使得其返回值不为“左值”。若指定成员函数为const类型,则表明其是一个常函数,不能修改类的成员变量,类的常对象只能访问类的常成员函数;

6、const成员函数可以访问非const对象的非const数据成员、const数据成员,也可以访问const对象内的所有数据成员;

7、非const成员函数可以访问非const对象的非const数据成员、const数据成员,但不可以访问const对象的任意数据成员;

8、一个没有明确声明为const的成员函数被看作是将要修改对象中数据成员的函数,而且编译器不允许它为一个const对象所调用。因此const对象只能调用const成员函数。

9const类型变量可以通过类型转换符const_cast将const类型转换为非const类型;

10、const类型变量必须定义的时候进行初始化,因此也导致如果类的成员变量有const类型的变量,那么该变量必须在类的初始化列表中进行初始化;

11、对于函数值传递的情况,因为参数传递是通过复制实参创建一个临时变量传递进函数的,函数内只能改变临时变量,但无法改变实参。则这个时候无论加不加const对实参不会产生任何影响。但是在引用或指针传递函数调用中,因为传进去的是一个引用或指针,这样函数内部可以改变引用或指针所指向的变量,这时const 才是实实在在地保护了实参所指向的变量。因为在编译阶段编译器对调用函数的选择是根据实参进行的,所以,只有引用传递和指针传递可以用是否加const来重载。一个拥有顶层const的形参无法和另一个没有顶层const的形参区分开来。

8、const成员函数的理解和应用?

const Stock & Stock::topval (const Stock & s) const

①处const:确保返回的Stock对象在以后的使用中不能被修改  

②处const:确保此方法不修改传递的参数 S

③处const:保证此方法不修改调用它的对象,const对象只能调用const成员函数,不能调用非const函数

9、指针和const的用法?const 修饰指针如何区分?

当const修饰指针时,由于const的位置不同,它的修饰对象会有所不同。

1、int *const p2中const修饰p2的值,所以理解为p2的值不可以改变,即p2只能指向固定的一个变量地址,但可以通过*p2读写这个变量的值。顶层指针表示指针本身是一个常量

2、int const *p1或者const int *p1两种情况中const修饰*p1,所以理解为*p1的值不可以改变,即不可以给*p1赋值改变p1指向变量的值,但可以通过给p赋值不同的地址改变这个指针指向。底层指针表示指针所指向的变量是一个常量。

4、int const *const p;p这个指针不可改,指向的值也不可变。

示例:下⾯都是合法的声明,但是含义⼤不同:

const int * p1; //指向整形常量的指针,它指向的值不能修改

int * const p2; //指向整形的常量指针 ,它不能在指向别的变量,但指向(变量)的值可以修改。

const int *const p3; //指向整形常量 的 常量指针 。它既不能再指向别的常量,指向的值也不能修改。

理解这些声明的技巧在于,const是右结合型。查看关键字const右边来确定什么被声明为常量 ,如果该关键字的右边是类型,则值是常量;如果关键字的右边是指针变量,则指针本身是常量。

10、 C++⾥是怎么定义常量的?常量存放在内存的哪个位置?

对于局部常量,存放在栈区;

对于全局常量,编译期⼀般不分配内存,放在符号表中以提⾼访问效率;

字⾯值常量,⽐如字符串,放在常量区。