目录
第1章 C++基础
1 C++中static静态变量有什么作用,在什么情况下会用?
2 类中的this指针指向哪里?
3 说一下const的作用。
4 std::string类型为啥不能memset?
5 emplace_back( )和push_back( )有什么区别?
6 traits是什么?什么时候用traits?
第2章 指针和引用
1 指针和引用的区别
2 为什么引用比指针安全?
3 什么是“野指针”和形成原因?
4 C++函数指针有哪几类?
5 函数指针、lambda、仿函数对象分别是什么?
7 什么是万能引用?
8 万能引用与右值引用的区别
9 智能指针和祼指针之间的差异?为什么要用指针的引用计数?
10 悬挂指针会导致什么问题?如何避免?
第3章 C++继承和多态
1 说一下C++多态的实现原理。
第4章 多线程
1 C++多线程中进程间通信的手段有哪些?
2 如何在c++中创建线程?如何在线程间同步?
3 互斥锁是什么?用途是什么?条件变量又是什么?为什么要用条件变量?
第5章 标准库STL
1 如何利用谓词对给定容器进行自定义排序?
2 std::unorded_map和std::map之间的差异是什么?
第6章 数据结构
1 如果你来设计vector,你会怎么设计?
2 给你一个vector,求第k大的那个元素。
3 写一个Vec2d类,支持加、减、数乘、数除等操作。
第7章 虚函数
1 C++的构造函数可以是虚函数吗?
2 虚函数有什么作用,析构函数为什么定义为虚函数?
3 虚函数、虚表的原理
第8章 函数对象
1 函数对象应该通过什么传递?
第1章 C++基础
1 C++中static静态变量有什么作用,在什么情况下会用?
2 类中的this指针指向哪里?
3 说一下const的作用。
4 std::string类型为啥不能memset?
5 emplace_back( )和push_back( )有什么区别?
6 traits是什么?什么时候用traits?
第2章 指针和引用
1 指针和引用的区别
参考文章:C++中指针与引用的区别 - 知乎
指针和引用都可以作为函数参数,改变实参的值。
(1) 两者的定义和性质不同
- 指针是一个变量,存储的是一个地址,指向内存的一个存储单元;
- 引用是原变量的一个别名,跟原来的变量实质上是同一个东西。
int a = 996;
int *p = &a; // p是指针, &在此是求地址运算,p 的值是变量 a 的地址
int &r = a; // r是引用, &在此起标识作用,是 a 的一个别名
(2) 指针可以有多级,引用只能是一级
int **p; // 合法
int &&a; // 不合法
(3) 指针可以在定义的时候不初始化,引用必须在定义的时候初始化
int *p; // 合法
int &r; // 不合法
int a = 996;
int &r = a; // 合法
(4) 指针可以指向NULL,引用不可以为NULL
int *p = NULL; // 合法
int &r = NULL; // 不合法
(5) 指针初始化之后可以再改变,引用不可以
int a = 996;
int *p = &a; // 初始化, p 是 a 的地址
int &r = a; // 初始化, r 是 a 的引用
int b = 885;
p = &b; // 合法, p 更改为 b 的地址
r = b; // 不合法, r 不可以再变
(6) sizeof 的运算结果不同
int a = 996;
int *p = &a;
int &r = a;
cout << sizeof(p); // 返回 int* 类型的大小
cout << sizeof(r); // 返回 int 类型的大小
在64位机器上,int* 类型的大小为8个字节,int类型的大小为4个字节。
(7) 自增运算意义不同
如下图所示,p++之后指向a后面的内存,r++相当于a++。
int a = 996;
int *p = &a;
int &r = a;
p++; //p指向后面的内存
r++; //相当于a++
(8) 指针和引用作为函数参数时,指针需要检查是否为空,引用不需要
void fun_p(int *p)
{
// 需要检查P是否为空
if (p == NULL)
{
// do something
}
}
2 为什么引用比指针安全?
- 由于不存在空引用,并且引用一旦被初始化为指向一个对象,它就不能被改变为另一个对象的引用,因此引用很安全。
- 对于指针来说,它可以随时指向别的对象,并且可以不被初始化,或为ULL,所以不安全。const指针仍然存在空指针,并且有可能产生野指针。
3 什么是“野指针”和形成原因?
野指针:“野指针”不是NULL指针,而是指向“垃圾”内存的指针。人们一般不会错用NULL指针,因为用f语句很容易判断。但是“野指针”是很危险的,f语句对它不起作用。
野指针的成因主要有两种:
- 指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的默认值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。
- 指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。
4 C++函数指针有哪几类?
C++函数指针有成员函数指针、静态函数指针、全局函数指针。
5 函数指针、lambda、仿函数对象分别是什么?
函数指针:指针指向普通的函数对象,函数指针是指针,不是函数,指针只是一个变量。
lambda: C++11后支持的匿名函数对象,可捕获函数域外的变量。
仿函数对象:仿函数是STL的6大组件之一(Allocator, Algorithm, Adapter, Container, Functor(function objects), Iterator)。 仿函数(functor),就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类。该类重载了operator()运算符,调用仿函数的时候实际上就是通过类对象调用重载后的operator操作符,重载operator()和重载普通的函数效果相同,当参数类型不同时会执行不同的代码逻辑,让类型可以模仿函数调用的行为。
6 智能指针分哪几种?std::unique_ptr, std::shared_ptr, std::weak_ptr各有何用途?
c++里面有四个智能指针: auto_ptr(已经被c++11弃用), shared_ptr, weak_ptr, unique_ptr.
智能指针就是一个类,当超过类的作用域时,类会自动调用析构函数,自动释放资源.
unique_ptr:保证同一时间只有一个智能指针可以指向该对象
unique_ptr<string> p3 (new string ("auto"));
unique_ptr<string> p4;
p4 = p3;//此时会报错!!
shared_ptr:个智能指针可以指向相同对象,该对象和其相关资源会在 "最后一个引用被销毁" 时释放
weak_ptr:是一种不控制对象生命周期的智能指针,weak_ptr只是提供了对管理对象的一个访问手段
7 什么是万能引用?
万能引用(Universal Reference)是指模板参数使用 && 时,能够接受任何类型的引用,包括左值引用和右值引用。右值引用是指绑定到右值的引用,可以实现移动语义和完美转发。
8 万能引用与右值引用的区别
- 万能引用是模板参数的一种表达方式,而右值引用是一种变量类型。
- 万能引用可以接受任何类型的引用,包括左值引用和右值引用,而右值引用只能接受右值引用。
- 万能引用在模板函数中用于实现完美转发,而右值引用主要用于实现移动语义。
- 万能引用的声明方式为 T&&,而右值引用的声明方式为 X&&,其中 T 和 X 都表示类型。
9 智能指针和祼指针之间的差异?为什么要用指针的引用计数?
10 悬挂指针会导致什么问题?如何避免?
第3章 C++继承和多态
1 说一下C++多态的实现原理。
第4章 多线程
1 C++多线程中进程间通信的手段有哪些?
2 如何在c++中创建线程?如何在线程间同步?
3 互斥锁是什么?用途是什么?条件变量又是什么?为什么要用条件变量?
第5章 标准库STL
1 如何利用谓词对给定容器进行自定义排序?
2 std::unorded_map和std::map之间的差异是什么?
第6章 数据结构
1 如果你来设计vector,你会怎么设计?
2 给你一个vector,求第k大的那个元素。
3 写一个Vec2d类,支持加、减、数乘、数除等操作。
第7章 虚函数
1 C++的构造函数可以是虚函数吗?
2 虚函数有什么作用,析构函数为什么定义为虚函数?
3 虚函数、虚表的原理
第8章 函数对象
1 函数对象应该通过什么传递?
参考文章:
(1)『干货』SLAM工程师需要掌握哪些C++知识点_vector_什么_std
(2)SLAM 面试时问到的C++问题_slam c++_每天都在努力学习SLAM的小黑的博客-CSDN博客