【C++上岸】C++常见面试题目(第七期)
·
大家好!欢迎来到C++面试宝典第七期!😊 本期我们将一起攻克C++面试中的高频问题。这些知识点是面试官的“心头好”,掌握它们能让你在求职路上如虎添翼!💪 让我们开始吧!
文章目录
🧠 1. C++的空类默认包含哪些成员函数?
空类编译器会自动生成6个成员函数:
class Empty {}; // 空类声明
// 编译器自动生成:
1. 默认构造函数:Empty()
2. 拷贝构造函数:Empty(const Empty&)
3. 移动构造函数:Empty(Empty&&) // C++11新增
4. 拷贝赋值运算符:Empty& operator=(const Empty&)
5. 移动赋值运算符:Empty& operator=(Empty&&) // C++11新增
6. 析构函数:~Empty()
注意:这些函数只有在被调用时才会真正生成![吃瓜]
🔒 2. 简述常引用的作用
常引用(const T&)两大核心作用:
- 避免拷贝开销:传递大型对象时不复制数据
- 防止意外修改:保护原始数据不被函数篡改
void print(const std::string& str) {
// str[0]='A'; // 错误!常引用禁止修改
std::cout << str;
}
适用场景:函数参数、返回值(如operator<<)[护盾]
📦 3. 函数模板 vs 模板函数
- 函数模板:通用函数蓝图(未实例化)
template<typename T> T max(T a, T b) { return a > b ? a : b; } - 模板函数:模板实例化后的具体函数
int max<int>(int, int); // 显式实例化 double max<double>(double, double);
简单说:模板是"菜谱",模板函数是"做好的菜"!
🤖 4. 智能指针简介
管理堆内存的自动化工具,避免内存泄漏:
| 类型 | 特点 | 适用场景 |
|---|---|---|
unique_ptr |
独占所有权,不可拷贝 | 单一所有权资源 |
shared_ptr |
引用计数,可共享所有权 | 共享资源 |
weak_ptr |
观察者,不增加引用计数 | 解决shared_ptr循环引用 |
auto p = std::make_unique<MyClass>(); // C++14首选
🔧 5. 四种cast转换
C++风格转换更安全可控:
| 转换类型 | 作用 | 示例 |
|---|---|---|
static_cast |
编译时类型转换 | int→double |
dynamic_cast |
运行时多态类型转换 | 基类指针→派生类指针 |
const_cast |
移除const属性 |
修改常量指针 |
reinterpret_cast |
低层二进制重解释 | 指针→整数 |
黄金法则:优先用static_cast,少用reinterpret_cast![警告] |
❌ 6. 虚函数可以是模板函数吗?
不可以! 原因有二:
- 虚函数依赖虚函数表(vtable),其布局需在编译期确定
- 模板函数实例化在运行时才能确定具体类型
编译器会直接报错:
class Base {
public:
template<typename T>
virtual void func(T); // 错误!virtual与template不能共存
};
🧩 7. 虚函数表针对类还是对象?
虚函数表(vtable)是类级别的!
- 每个包含虚函数的类拥有一张vtable
- 每个对象通过vptr指针(隐藏成员)访问所属类的vtable
⚙️ 8. 操作符重载与限制
重载本质:赋予操作符自定义行为
Vector operator+(const Vector& v1, const Vector& v2) {
return Vector(v1.x+v2.x, v1.y+v2.y);
}
禁止重载的操作符:
:: . .* ?: sizeof typeid alignof noexcept
注意:&&、||重载后会失去短路求值特性![闪电]
🌀 9. 纯虚函数
定义:没有实现的虚函数,强制派生类实现
class Shape {
public:
virtual void draw() = 0; // =0 表示纯虚函数
};
关键特性:
- 含纯虚函数的类是抽象类(不能实例化)
- 派生类必须实现所有纯虚函数,否则仍是抽象类
🚫 10. 不能声明为虚函数的函数
| 函数类型 | 原因 |
|---|---|
| 构造函数 | 对象未完全构造时无法确定vtable |
| 静态成员函数 | 独立于对象,无this指针 |
| 内联函数 | 编译期展开,与运行时多态冲突 |
| 友元函数 | 非成员函数,无vtable访问权限 |
| 普通函数(非成员) | 不属于任何类 |
特例:析构函数应该是虚函数(基类指针删除派生对象时)!
🎉 结语
本期博文深入解析了C++面试的核心概念,覆盖了高频考点。记住:理解原理 + 多写代码 = 面试无敌!收藏本文,面试前翻一翻,上岸更轻松! 如果觉得有用,点赞支持一下,你的鼓励是我持续更新的动力!😊 也欢迎关注我,获取更多“C++上岸”系列干货。下期见!👋
互动话题:你被问过最刁钻的C++问题是什么?评论区见~
更多推荐


所有评论(0)