C++ 八股学习笔记。

1.C++ 新特性。

C++ 的新特性主要是 C++11 开始的

  1. 引入了智能指针,​基于 RAI 管理动态资源

  2. 右值引用和移动语义,​可以减少深拷贝操作,​对于临时对象的深拷贝

  3. 类型推导,​auto 等类型推导机制

  4. 使用 lambda 表达式,​结合容器和算法,​非常便利

  5. 就是引入了多线程库

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 表达式、多线程、智能指针和右值引用和移动语义。

相关推荐
蒸蒸yyyyzwd3 天前
后端学习笔记三个知识
笔记·八股
蒸蒸yyyyzwd3 天前
学习笔记 复盘
笔记·八股
香蕉大香蕉(06敬畏市场)4 天前
MySQL 单点详解(09)
java·数据库·mysql·面试·八股·大厂实习
香蕉大香蕉(06敬畏市场)5 天前
MySQL 单点详解(07)
java·数据库·mysql·ai·博客·八股
香蕉大香蕉(06敬畏市场)5 天前
MySQL 单点详解(08)
java·数据库·mysql·面试·八股
香蕉大香蕉(06敬畏市场)6 天前
MySQL 单点详解(03)
java·数据库·mysql·面试·八股·大厂实习
蒸蒸yyyyzwd6 天前
学习笔记day92
笔记·八股
香蕉大香蕉(06敬畏市场)8 天前
高频八股 · JVM(8)
java·jvm·面试·八股·大厂实习
蒸蒸yyyyzwd9 天前
kafka、redis、mysql不熟悉问题总结
笔记·八股
香蕉大香蕉(06敬畏市场)9 天前
高频八股 · JVM(7):方法区、元空间与字符串常量池
java·jvm·ai·博客·八股·大厂实习