1.C++ 新特性。
C++ 的新特性主要是 C++11 开始的
-
引入了智能指针,基于 RAI 管理动态资源
-
右值引用和移动语义,可以减少深拷贝操作,对于临时对象的深拷贝
-
类型推导,auto 等类型推导机制
-
使用 lambda 表达式,结合容器和算法,非常便利
-
就是引入了多线程库
2.在什么情况下,析构函数需要声明成虚函数?
答,在有用基类的指针或者引用绑定子类的对象,通过基类的指针或者引用释放子类对象,析构此类对象的场景需要声明成虚析构函数,否则它可能不能够正确的析构。
3.函数重载和函数重写的区别。
函数重载和函数重写,它们是静态多态和动态多态。函数重载通过函数的参数类型、参数个数以及参数顺序来区分,然后在编译期间进行类型匹配。函数的返回值类型不作为匹配的签名。函数重写是指父类的虚函数在子类中被重写,它们的签名是一致的,可以通过基类或者引用或者指针去调用子类的对象,产生不同的行为,是在运行期间绑定,所以叫动态绑定。
4.C++ 的虚函数是怎么实现的?或者说多态是怎么实现的?
这里主要说的是动态多态,它是通过虚函数表实现的。对于含有虚函数的类,它的调用是通过虚函数指针,每一个类有一张虚函数表存储虚函数指针。然后具有虚函数的类,它的对象在实例化过程中会有一个虚函数表指针。在调用的过程中,根据虚函数表指针查找虚函数表,根据虚函数表查找虚函数的指针,然后根据虚函数指针去具体的进行调用。
拥有虚函数的类,它的对象在实例化之后会多一个指针的大小。
5.讲解一下关于智能指针,你知道的内容。
所谓智能指针是一种模板,它能够基于 AI 去管理指针,避免我们手动的去释放资源,造成内存泄露。智能指针有 unique_ptr、 shared_ptr 和 weak_ptr。unique_ptr 只有一个变量去访问空间,它只能移动,不能被拷贝。shared_ptr 具有线程安全的引用技术,当引用技术不为 0 时,空间不会被释放。每一个 shared_ptr 增加一个引用技术。weak_ptr 和 shared_ptr 可以结合起来使用,它不增加引用技术。避免了 shared ptr 循环引用的问题。
这里有一个拓展,就是线程安全的引用技术是线程安全的,但是 shared_ptr 变量本身以及管理的那块堆上的空间不是线程安全的。
6.讲解一下 C++ 的容器的使用场景。
对于 C++ 的容器分成序列式容器和关联式容器。在序列式容器里,vector 是首选,它支持高效的在队尾的插入和删除,支持随机访问。但是在于中间的插入和删除效率不是那么高,在这种情况下,如果是频繁的在中间插入和删除,就使用 list
然后除此之外,如果是使用关联容器,如果是正常的查找,就使用 map 或者 set。如果是只是追求 O1 的访问,可以使用 unordered map 和 unordered set。在具体的特性下,比如说先进先出或者后进先出的场景,再去使用。栈或者队列
7.在什么场景下会使用模板?
模板是 C++ 实现泛型编程的核心。在 C++ 的标准库设计中,比如说容器是使用模板,算法如 sort 是使用模板,迭代器是使用模板。在实现过程中,对于通用的工具和库要可以用模板去实现,但是对于日常或者工程化的代码,就不要滥用模板。模板会在编译过程中根据类型生成具体的代码
8.静态链接和动态链接的区别是什么?
静态链接和动态链接的区别主要是库代码的编译时机、被复制到可执行代码的时机以及共享方式不同。静态链接在编译期间就把库代码复制到可执行文件中,多个程序中可能重复包含,它的文件比较大。而动态链接是在编译期只记录库的依赖关系,在运行时再去加载具体的库,多个程序的动态库可以共享。它的优点是节省空间,但是缺点是可能会出现动态库缺失或者版本不兼容的问题。
9.C 语言的 Struct 和 C++ 的 Class,它们的区别是什么?
C++ 的类提供了类型访问控制。C++ 分成 public、 protected 和 private,而 C 语言没有这些。C++ 的类具有静态成员变量或者静态成员函数,还有成员函数。而 C 的类是不具有成员函数的。然后对于 Struct,C++ 的默认是 public 的,而 Class 默认是 private 的。
这里感觉对于 C++ 的新特性是考察最多的,然后主要是 5 个类型推导、Lambda 表达式、多线程、智能指针和右值引用和移动语义。