C++面试常见问题补充

转载知乎博主总结:

C++面试常见问题

补充:

1. 指针常量(int *const p)和常量指针的区别(const int *p、int const *p)?

指针常量:本质上是一个常量,指针用来说明常量的类型,表示该常量是一个指针类型的常量。在指针常量中,指针自身的值是一个常量,不可改变,始终指向同一个地址,在定义的同时必须初始化。(指向的地址是一定的,但其内容可以修改)

常量指针:本质上一个指针,常量表示指针指向的内容,说明指针指向一个“常量”。在常量指针中,指针指向的内容是不可改变的,指针好起来好像指向了一个常量。(指针可以指向其它地址,但其内容不可以改变)

2. 深拷贝和浅拷贝的区别?

浅拷贝:只是对指针的拷贝,拷贝后两个指针指向同一个内存空间。

深拷贝:不但对指针进行拷贝,而且对指针指向的内容进行拷贝,拷贝后的指针是两个不同地址的指针。

当对象中存在指针成员时,浅拷贝带来的问题本质是析构函数释放多次内存,可使用std::shared_ptr解决这个问题。

3. 类的三个基本特征是什么、类的类型兼容规则是什么?

封装:代码模块化

继承:代码重用

多态:接口重用

1) 派生类对象可以隐含转换为基类对象;

2) 派生类对象可以初始化为基类的引用;

3) 派生类的指针可以隐含的转换为基类的指针;

4. 指针和引用的区别?

相同点:都是地址的概念,指针是指向一块内存,内容是指向内存的地址;引用是某块内存的别名。

不同点:

1) 指针是一个实体,而引用是一个别名;

2) 引用在使用时无需解引用(*),指针需要解引用;

3) 引用只能在定义时初始化一次,之后不可变;指针可变;

4) 引用没有const,指针有const;

5) 引用不能为空,指针可以为空;

6) sizeof 引用得到的是变量(对象)的大小;而sizeof指针得到本身大小;

5. 右值引用和move语义

1) 左值和右值的区别:

    左值是表达式结束后依然持久存在的对象;

    右值是表达式结束后不存在的临时对象;

    区分左值和右值的方法:是否能对表达式取地址,如果能,则为左值,否则为右值。

2) C++11特性中用&表示左值引用,用&&表示右值引用;

3) move语义允许一个对象在特定的情形下,取其它对象的资源;

6. 普通函数可以钓鱼const函数,也可以调用非const函数,但是const对象只能调用const函数

7. 函数指针和指针函数的区别?

1) 函数指针 :一个函数总是占用一段连续的内存区,函数名作为所占内存区首地址,把首地址赋予一个指针变量,指向该函数,通过指针变量调用这个函数。//   int (*f) (int x); 

2) 指针函数:返回值是一个指针(即地址);  //int *func(int a)

8. 内存分为哪些区?

堆(后进先出)、栈(先进后出)、全局区(静态区)、文字常量区、程序代码区

9. static关键字的作用

1) 函数体内static变量作用范围为该函数体,不同于auto变量,内存只分配一次,下次调用仍为上次的值。

2) 模块内static变量可以模块内访问,不能被模块外访问;

3) 模块内static函数限制模块内;

4) 类型static成员变量属于整个类,只有一份拷贝;

5) 类中static成员函数属于类,只能访问static成员变量,不接受this指针;

10. inline内联关键字的作用

1) 函数调用时代码替换(省去调用开销,效率高,但占用空间开销)

2) 变量自动替换(代码中形参和实参替换)

11. 禁止异常传递到析构函数中的原因:

1) 能够在异常传递的堆栈碾转开解的过程中防止terminate被调用;

2) 帮助确保析构函数总能完成我们希望它做的事;

12. 两个map进行拷贝:先swap,然后std::copy()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章