面向对象(OOP)绝对是 C++ 面试的 “核心考点区”!
不管是应届生笔试,还是社招技术面,总能遇到 “空类有哪些默认函数?”“struct 和 class 的区别?”“构造函数为什么不能是虚函数?” 这类题。看似基础,却藏着超多易混淆点,不少技术人栽在上面丢分。今天拆解面向对象的高频真题、易错点和避坑技巧,帮你吃透基础分,笔试面试不踩雷~一、核心三要素:封装、继承、多态,面试必问!
这是面向对象的灵魂考点,面试官必问 “请解释面向对象的三大特性”,记住 “定义 + 示例” 的回答逻辑,满分到手:面试真题
正确答案
封装:把数据和操作数据的方法绑定在一起,隐藏内部实现细节,只暴露对外接口。示例:一个 “Person” 类,把 “姓名、年龄” 作为私有成员(private),通过 “get 姓名、set 年龄” 的公有方法(public)访问,避免数据被随意修改。
继承:子类继承父类的属性和方法,同时可以扩展自己的功能,实现代码复用。示例:“Student” 类继承 “Person” 类,继承了 “姓名、年龄” 属性,同时新增 “学号、成绩” 属性和 “选课、考试” 方法。
多态:“一个接口,多种实现”,子类重写父类方法后,父类指针可以调用子类的具体实现。示例:父类 “Shape” 有 “计算面积” 方法,子类 “Circle”“Rectangle” 重写该方法,父类指针指向不同子类对象时,自动调用对应子类的面积计算逻辑(比如 “画圆”“画矩形” 都是 “画” 的多态)。
避坑技巧
回答时别只说定义!一定要配简单示例,比如用 “Shape→Circle/Rectangle” 举例多态,面试官更容易 get 到你的理解深度。二、高频坑 1:空类默认有哪些成员函数?90% 的人答不全!
面试真题
“C++ 中的空类(class Empty {}),编译器默认会生成哪些成员函数?”易错答案:没有任何函数(大错特错!)
正确答案:4 个默认成员函数
默认构造函数(Empty ()):无参构造,创建对象时自动调用;
析构函数(~Empty ()):对象销毁时自动调用,释放资源;
复制构造函数(Empty (const Empty&)):用已有对象初始化新对象时调用;
赋值运算符重载(Empty& operator=(const Empty&)):对象赋值时调用(比如 a = b)。
延伸考点
如果手动定义了构造函数(比如带参构造),编译器还会生成默认构造函数吗?答案:不会!只有当没有任何构造函数时,编译器才会生成默认无参构造。避坑技巧
记住 “空类≠无函数”,4 个默认函数是基础考点,面试时直接按清单罗列,再补充 “手动定义构造后默认构造失效”,加分项 get~三、高频坑 2:struct 和 class 的区别,别再只说 “默认访问权限”!
面试真题
“C++ 中 struct 和 class 有什么区别?struct 可以有构造函数和析构函数吗?”易错答案:struct 没有构造 / 析构函数,class 有(错!)
正确答案
核心区别:默认访问权限不同
其他共性
示例验证
// struct也能有构造和成员函数
struct Person {
string name;
// 构造函数
Person(string n) : name(n) {}
// 成员函数
void show() { cout << name << endl; }
};
// 调用完全没问题
Person p("张三");
p.show(); // 输出“张三”
避坑技巧
回答时先讲核心区别(默认访问权限),再补充 “struct 支持所有 class 的特性”,避免被面试官追问时露怯。四、高频坑 3:虚函数的 “禁忌” 与 “代价”,这些规则别记错!
虚函数是多态的核心,面试高频考点集中在 “构造函数能否为虚”“虚函数的开销”,记住这 2 个关键问题:面试真题 1
“析构函数可以是 virtual 型,构造函数为什么不能为虚?”正确答案
虚函数的调用需要 “虚表指针(vptr)”,而 vptr 是在对象构造时初始化的。如果构造函数是虚函数,调用时 vptr 还未初始化,无法找到对应的虚函数地址,导致调用失败。简单说:“创建对象必须知道准确类型,虚函数是‘运行时确定类型’,矛盾所以不能为虚”。面试真题 2
“虚函数很有用,能不能把所有函数都声明为虚函数?”正确答案:不能!虚函数有明确代价
空间开销:每个带虚函数的对象会多一个 vptr 指针(4/8 字节),指向虚函数表(vtable);
时间开销:虚函数调用需要通过 vptr 查找 vtable,比普通函数多一次间接寻址,效率略低;
适用场景:只有需要子类重写的函数才声明为虚函数(比如父类的 “计算面积” 方法),普通函数无需声明。
避坑技巧
记住 “构造不虚、析构可虚(避免内存泄漏)”,虚函数不是 “越多越好”,按需声明才是最优解。五、高频坑 4:复制构造函数,哪些类不需要自定义?
面试真题
“以下哪个类不需要自定义复制构造函数?(单选)”A. 动态分配内存的矩阵类B. 唯一 ID 的花名册类C. 包含 string 和 vector 的 word 类D. 管理文件句柄的类正确答案:C
解析
复制构造函数的核心作用是 “避免浅拷贝问题”(比如动态内存、文件句柄、唯一 ID 等场景):A/D:需要自定义 —— 矩阵类的动态内存、文件句柄的资源,默认复制会导致重复释放或资源冲突;
B:需要自定义 ——ID 唯一,默认复制会让两个对象 ID 相同,违反语义;
C:不需要自定义 ——string 和 vector 本身是 “成熟类”,自带正确的复制构造和赋值运算符,默认复制不会有问题。
避坑技巧
判断是否需要自定义复制构造函数,看 “是否包含‘需要手动管理的资源’”(动态内存、文件句柄、网络连接、唯一标识等),有则必须自定义,无则用默认即可。六、笔试易错点汇总(直接背!)
面向对象三大特性:封装(隐藏细节)、继承(代码复用)、多态(运行时绑定);
空类默认 4 个函数:默认构造、析构、复制构造、赋值重载;
struct 和 class 的核心区别:默认访问权限(public vs private),struct 支持构造 / 析构;
构造函数不能为虚,析构函数可以为虚(避免子类对象析构不彻底);
虚函数有开销(vptr+vtable),不能所有函数都声明为虚;
包含 string、vector 的类,无需自定义复制构造函数。
你们面试时遇到过最奇葩的问题是什么?是被笔试算法题难住,还是面谈时紧张到忘词?
是不是总觉得,职场路上总差那么一步?
✅ 想晋升,却被 “学历门槛” 卡住;
✅ 想跳槽,技能储备不够没底气;
✅ 站在职业十字路口,不知道往哪走;
✅ 投出 100 份简历,面试邀约寥寥无几……
别慌!我懂每一个职场人的挣扎与渴望,
关注我,后续持续分享「职场干货」「面试技巧」,陪你一起成长~
祝大家都能顺利通关,斩获心仪的大厂 Offer,在技术道路上越走越远!🚀