C++语言面试问题集锦 目录与说明
# C++语言面试问题集锦
# 说明
我学习和使用 C/C++ 开发快 13 年了,目前在大厂做架构,在学习 C/C++ 的过程中,我踩了一个又一个坑,深知新手学习 C/C++ 的重要性和存在的困难,面试通过和工作经验往往是一对先有鸡先有蛋的矛盾体。许多工作年限不长的 C/C++ 小伙伴在面试时被面试官的 C++ 语言题问得抓耳挠腮、怅然若失。特汇总常见的 C++ 面试语法题,分享出来,希望能助大家一臂之力。
当然,C++的面试的内容不仅仅只考察 C++语言本身,更多的还考察算法数据结构、操作系统原理、计算机网络(含网络编程)、数据库、项目经验等,也就是说我们常说的五大基础,本专栏只涵盖 C++ 语言本身的面试题,五大基础我以视频的形式整理在《C/C++后端开发常见面试题解析 (opens new window)》(设置了一个小小的收费门槛,收费不是目的,仅仅是为了过滤一些无效杂音)。
# 联系与交流
因个人水平有限,如果你在学习的过程中遇到问题想与小方交流,可以加微信cppxiaofang
,找工作的同学可以加入小方的 C++求职与技术交流群。
# 全套面试题下载
如果你想下载这套C++面试题,请加小方微信获取,备注“C++面试题”。
# 目录
-
- 问题1:解释auto类型推导!
- 问题2:auto在何时会推导出不理想的类型?
- 问题3:使用auto有哪些优点?
- 问题4:在以下声明后,myCollection的类型是什么?
- 问题5:后置返回类型是什么?
- 问题6:解释decltype!
- 问题7:何时使用decltype(auto)?
- 问题8:将两个bool类型相加,会得到什么数据类型?
-
- 问题9:C++中静态成员变量是什么意思?
- 问题10:C++中静态成员函数是什么意思?
- 问题11:什么是静态初始化顺序混乱问题?
- 问题12:如何解决静态初始化顺序混乱问题?
-
- 问题13:函数重载(function overloading)和函数重写(function overriding)有什么区别?
- 问题14:什么是虚函数?
- 问题15:override关键字是什么,它有什么优点?
- 问题16:解释协变返回类型(covariant return types)的概念,并举例说明其适用场景!
- 问题17:C++中的虚继承(virtual inheritance)是什么,何时应该使用它?
- 问题18:我们是否应该总是使用虚继承?如果是,为什么?如果不是,又为什么?
- 问题19:以下简单程序的输出是什么?这是你预期的结果吗?为什么是或为什么不是?
- 问题20:如果使用私有继承,能否访问基类的公有和受保护成员及函数?
- 问题21:私有继承用于什么场景?
- 问题22:能否在构造函数或析构函数中调用虚函数?
- 问题23:虚析构函数有什么作用?
- 问题24:我们可以从标准容器(如std::vector)继承吗?如果可以,会有什么影响?
- 问题25:强类型(strong type)是什么意思,它有什么优点?
- 问题26:解释短路求值(short - circuit evaluation)。
- 问题27:什么是析构函数,如何重载析构函数?
- 问题28:以下代码片段的输出是什么,为什么?
- 问题29:如何在C++中使用= delete说明符?
-
- 问题30:什么是立即调用的Lambda函数?
- 问题31:Lambda表达式有哪些可用的捕获方式?
[第五章 C++中const限定符的用法](06.C++中如何使用 const 限定符.md)
- 问题32:以下代码片段的输出是什么,为什么?
- 问题33:使用const局部变量有哪些优点?
- 问题34:在类中使用const成员是个好主意吗?
- 问题35:按值返回const对象有意义吗?
- 问题36:如何从函数中返回const指针?
- 问题37:函数应该返回const引用吗?
- 问题38:函数参数中,对于普通旧数据类型(plain old data types),是否应该通过const引用传递?
- 问题39:函数参数中,是否应该通过const引用传递对象?
- 问题40:函数声明的签名必须与函数定义的签名匹配吗?
- 问题41:解释consteval和constinit为C++带来了什么?
[第六章 Modern C++的一些最佳实践](07.Modern C++的一些最佳实践.md)
- 问题42:什么是聚合初始化(aggregate initialization)?
- 问题43:什么是显式构造函数(explicit constructors),它们有什么优点?
- 问题44:什么是用户自定义字面量(user - defined literals)?
- 问题45:为什么我们应该使用nullptr而不是NULL或0?
- 问题46:别名(alias)相较于typedef有什么优点?
- 问题47:作用域枚举(scoped enums)相较于非作用域枚举(unscoped enums)有什么优点?
- 问题48:是否应该显式删除未使用/不支持的特殊函数,还是将它们声明为私有?
- 问题49:如何在C++中使用= delete说明符?
- 问题50:C++中的平凡类(trivial class)是什么?
-
- 问题51:解释资源获取即初始化(Resource acquisition is initialization,RAII)惯用法。
- 问题52:我们应该在何时使用unique指针?
- 问题53:使用shared指针的原因有哪些?
- 问题54:何时使用weak指针?
- 问题55:相较于new运算符,std::make_shared和std::make_unique有哪些优点?
- 问题56:是否应该始终使用智能指针而不是原始指针?
- 问题57:何时以及为什么要将指针初始化为nullptr?
-
- 问题58:std::move移动了什么?
- 问题59:std::forward转发了什么?
- 问题60:万能引用(universal references)和右值引用(rvalue references)有什么区别?
- 问题61:什么是引用折叠(reference collapsing)?
- 问题62:constexpr函数何时求值?
- 问题63:何时应该将函数声明为noexcept?
-
- 问题64:C++中的概念(concepts)是什么?
- 问题65:C++中有哪些可用的标准属性?
- 问题66:三路比较(3 - way comparison)是什么?
- 问题67:解释consteval和constinit为C++带来了什么?
- 问题68:模块(modules)是什么,它们有什么优点?
-
- 问题69:解释三法则(rule of three)。
- 问题70:解释五法则(rule of five)。
- 问题71:解释零法则(rule of zero)。
- 问题72:std::move移动了什么?
- 问题73:什么是析构函数,如何重载析构函数?
- 问题74:是否应该显式删除未使用/不支持的特殊函数,还是将它们声明为私有?
- 问题75:C++中的平凡类是什么?
- 问题76:拥有默认构造函数有什么优点?
-
- 问题77:类(class)和结构体(struct)有什么区别?
- 问题78:构造函数委托(constructor delegation)是什么?
- 问题79:解释协变返回类型的概念,并举例说明其适用场景!
- 问题80:函数重载和函数重写有什么区别?
- 问题81:override关键字是什么,它有什么优点?
- 问题82:解释什么是友元类(friend class)或友元函数(friend function)。
- 问题83:默认参数(default arguments)是什么?在C++函数中它们是如何求值的?
- 问题84:this指针是什么,我们可以删除它吗?
- 问题85:C++中的虚继承是什么,何时应该使用它?
- 问题86:我们是否应该总是使用虚继承?如果是,为什么?如果不是,又为什么?
- 问题87:强类型是什么意思,它有什么优点?
- 问题88:什么是用户自定义字面量?
- 问题89:为什么我们不应该使用布尔参数?
- 问题90:区分浅拷贝(shallow copy)和深拷贝(deep copy)。
- 问题91:类函数是否会被计入对象大小?
- 问题92:动态分派(dynamic dispatch)是什么意思?
- 问题93:什么是虚函数表(vtable)和虚指针(vpointer)?
- 问题94:基类析构函数应该是虚函数吗?
- 问题95:C++中的抽象类(abstract class)是什么?
- 问题96:是否可能实现具有多态行为但没有虚函数开销的类?
- 问题97:如何使用奇特递归模板模式(Curiously Recurring Template Pattern,CRTP)为类添加功能?
- 问题98:使用初始化函数初始化对象有哪些充分的理由?
-
- 问题99:代码的可观察行为(observable behaviour)是什么?
- 问题100:一个错误构造的C++程序有哪些特征?
- 问题101:未指定行为(unspecified behaviour)是什么?
- 问题102:实现定义行为(implementation - defined behaviour)是什么?
- 问题103:C++中的未定义行为(undefined behaviour)是什么?
- 问题104:未定义行为存在的原因有哪些?
- 问题105:应采取哪些方法避免未定义行为?
- 问题106:什么是迭代器失效(iterator invalidation)?举几个例子。
-
- 问题107:什么是STL?
- 问题108:算法相较于原始循环有哪些优点?
- 问题109:算法会验证范围吗?
- 问题110:能否组合不同大小的容器?
- 问题111:vector的内存布局是如何组织的?
- 问题112:我们可以从标准容器(如std::vector)继承吗?如果可以,会有什么影响?
-
- 问题117:能否在构造函数或析构函数中调用虚函数?
- 问题118:默认参数是什么?在C++函数中它们是如何求值的?
- 问题119:虚函数可以有默认参数吗?
- 问题120:基类析构函数应该是虚函数吗?
- 问题121:mutable关键字的作用是什么?
- 问题122:volatile关键字的作用是什么?
- 问题123:什么是内联函数(inline function)?
- 问题124:我们捕获什么?
- 问题125:引用和指针有什么区别?
- 问题126:以下哪些变量声明可以编译,a的值会是什么?
- 问题127:下面这行代码会输出什么,为什么?
- 问题128:解释前置和后置递增/递减运算符的区别。
- 问题129:a、b和c的最终值是什么?
- 问题130:这个字符串声明能编译吗?
- 问题131:C++中的默认成员初始化器(Default Member Initializers)是什么?
- 问题132:什么是最令人困惑的解析(the most vexing parse)?
- 问题133:这段代码能编译吗?如果能,它会做什么?如果不能,为什么?
- 问题134:什么是std::string_view,为什么我们应该使用它?
- 问题135:如何检查一个字符串是否以某个子字符串开头或结尾?
- 问题136:什么是返回值优化(RVO)?
- 问题137:如何确保编译器执行返回值优化?
- 问题138:C++中的主要和混合值类别是什么?
- 问题139:可以安全地比较有符号和无符号整数吗?
- 问题140:main函数的返回值是什么,有哪些可用的签名?
- 问题141:你应该更喜欢默认参数还是函数重载?
- 问题142:一行中应该声明多少个变量?
- 问题143:你应该更喜欢switch语句还是链式if语句?
- 问题144:什么是包含保护(include guards)?
- 问题145:包含文件时,应该使用尖括号(<filename>)还是双引号("filename")?
- 问题146:一个函数中应该有多少个返回语句?