大家好!欢迎来到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&)两大核心作用:

  1. 避免拷贝开销:传递大型对象时不复制数据
  2. 防止意外修改:保护原始数据不被函数篡改
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 编译时类型转换 intdouble
dynamic_cast 运行时多态类型转换 基类指针→派生类指针
const_cast 移除const属性 修改常量指针
reinterpret_cast 低层二进制重解释 指针→整数
黄金法则:优先用static_cast,少用reinterpret_cast![警告]

❌ 6. 虚函数可以是模板函数吗?

不可以! 原因有二:

  1. 虚函数依赖虚函数表(vtable),其布局需在编译期确定
  2. 模板函数实例化在运行时才能确定具体类型
    编译器会直接报错:
class Base {
public:
    template<typename T>
    virtual void func(T); // 错误!virtual与template不能共存
};

🧩 7. 虚函数表针对类还是对象?

虚函数表(vtable)是类级别的!

  • 每个包含虚函数的类拥有一张vtable
  • 每个对象通过vptr指针(隐藏成员)访问所属类的vtable
类A
vtable
对象1
vptr
对象2
vptr

⚙️ 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++问题是什么?评论区见~

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐