C++ 从 0 入门(三)|类与对象基础(封装、构造 / 析构函数,面试必考)

张开发
2026/4/18 0:20:53 15 分钟阅读

分享文章

C++ 从 0 入门(三)|类与对象基础(封装、构造 / 析构函数,面试必考)
大家好我是网域小星球。本篇是 C 面向对象的核心开篇也是C 面试重中之重—— 类与对象基础。面试官几乎都会问封装、构造函数、析构函数的用法甚至让手撕代码。本篇全程聚焦面试考点不冗余、只讲核心代码 VS2022 直接运行吃透就能应对类与对象的基础面试提问。目录一、核心学习目标面试导向二、类与对象的概念面试基础题1. 核心定义面试直接答2. 类的基础语法必写3. 访问权限封装的核心面试必问三、构造函数面试必考重中之重1. 核心作用2. 构造函数的 3 个特点面试必背3. 构造函数的 3 种写法笔试常考4. 面试坑点必避四、析构函数面试必考与构造函数成对出现1. 核心作用2. 析构函数的 3 个特点面试必背3. 析构函数用法结合动态内存面试常考4. 面试考点高频五、构造 / 析构函数的调用顺序面试笔试题六、本章核心总结面试速记下期预告一、核心学习目标面试导向掌握类与对象的概念面向对象核心面试必问理解封装特性C 三大特性之首定义 用法熟练掌握构造函数写法、作用、面试常考重载熟练掌握析构函数写法、作用、内存释放逻辑避开构造 / 析构函数的常见面试坑点二、类与对象的概念面试基础题1. 核心定义面试直接答类class抽象的模板定义对象的属性成员变量和行为成员函数不占用内存对象类的实例化根据类模板创建的具体实体占用内存关系类是对象的 “蓝图”对象是类的 “具体实现”比如 “人类” 是类“张三” 是对象。2. 类的基础语法必写#include iostream #include string using namespace std; // 类的定义class关键字 class Person { // 访问权限封装的核心 public: // 公有类内、类外都能访问常用 // 成员变量属性 string name; int age; // 成员函数行为 void showInfo() { cout 姓名 name 年龄 age endl; } private: // 私有只有类内能访问封装核心隐藏细节 string id; // 私有成员类外无法直接访问 }; // 主函数实例化对象 int main() { // 方式1默认实例化 Person p1; p1.name 张三; // 公有成员类外可访问 p1.age 20; p1.showInfo(); // 调用成员函数 // 方式2直接初始化 Person p2 {李四, 22}; p2.showInfo(); return 0; }3. 访问权限封装的核心面试必问C 用访问权限实现封装三种权限牢记public公有类内、类外均可访问常用成员函数、对外暴露的属性private私有只有类内可访问核心属性隐藏细节比如身份证号、密码protected保护类内可访问子类可访问后续继承章节讲解。面试考点封装的作用答隐藏对象的核心细节只对外暴露必要的接口提高代码安全性、可维护性。三、构造函数面试必考重中之重1. 核心作用对象创建时自动调用用于初始化对象的成员变量避免成员变量为随机值无需手动调用。2. 构造函数的 3 个特点面试必背函数名和类名完全相同没有返回值连 void 都不写可重载面试常考多构造函数适配不同初始化场景。3. 构造函数的 3 种写法笔试常考#include iostream #include string using namespace std; class Person { public: string name; int age; // 1. 无参构造函数默认构造 Person() { name 未知; age 0; cout 无参构造函数调用 endl; } // 2. 有参构造函数常用 Person(string n, int a) { name n; age a; cout 有参构造函数调用 endl; } // 3. 拷贝构造函数面试高频用一个对象初始化另一个对象 Person(const Person p) { name p.name; // 把p的name赋值给当前对象 age p.age; // 把p的age赋值给当前对象 cout 拷贝构造函数调用 endl; } void showInfo() { cout 姓名 name 年龄 age endl; } }; int main() { Person p1; // 调用无参构造 Person p2(张三, 20); // 调用有参构造 Person p3 p2; // 调用拷贝构造用p2初始化p3 p1.showInfo(); p2.showInfo(); p3.showInfo(); return 0; }4. 面试坑点必避若手动写了有参构造编译器不会再自动生成无参构造需手动写否则报错拷贝构造函数的参数必须加const避免修改原对象且必须是引用避免无限递归无参构造和默认构造的区别无参构造是手动写的默认构造是编译器自动生成的若未写任何构造。四、析构函数面试必考与构造函数成对出现1. 核心作用对象销毁时自动调用用于释放对象占用的资源比如动态内存、文件句柄无需手动调用。2. 析构函数的 3 个特点面试必背函数名~类名波浪线 类名没有返回值也没有参数不能重载只能有一个若未手动写编译器会自动生成默认析构函数但无法释放动态内存面试常考。3. 析构函数用法结合动态内存面试常考#include iostream #include string using namespace std; class Person { public: string name; int* age; // 动态内存指针面试常考场景 // 有参构造申请动态内存 Person(string n, int a) { name n; age new int(a); // 申请堆内存存储年龄 cout 有参构造调用申请内存 endl; } // 析构函数释放动态内存必须手动写 ~Person() { if (age ! nullptr) // 避免野指针 { delete age; // 释放堆内存 age nullptr; // 置空防止野指针 } cout 析构函数调用释放内存 endl; } void showInfo() { cout 姓名 name 年龄 *age endl; } }; int main() { Person p(张三, 20); p.showInfo(); // 函数结束对象p销毁自动调用析构函数释放内存 return 0; }4. 面试考点高频析构函数为什么不能有参数答析构函数是对象销毁时自动调用的无法手动传递参数所以不能重载只能有一个。什么时候必须手动写析构函数答当类的成员变量有动态内存new 申请的内存时必须手动写析构函数释放否则会造成内存泄漏。五、构造 / 析构函数的调用顺序面试笔试题牢记先构造后析构构造顺序与对象创建顺序一致析构顺序相反。示例代码笔试常考#include iostream using namespace std; class A { public: A() { cout A构造 endl; } ~A() { cout A析构 endl; } }; class B { public: B() { cout B构造 endl; } ~B() { cout B析构 endl; } }; int main() { A a; // 先创建A调用A构造 B b; // 再创建B调用B构造 // 析构顺序先析构后创建的B再析构先创建的A return 0; }输出结果面试直接答A 构造 → B 构造 → B 析构 → A 析构六、本章核心总结面试速记类是模板无内存对象是实例有内存封装通过访问权限实现构造函数类名相同、无返回值、可重载对象创建时自动调用用于初始化析构函数~ 类名、无返回值、无参数对象销毁时自动调用用于释放资源动态内存必须在析构函数中释放否则内存泄漏面试重点构造顺序与对象创建一致析构顺序相反笔试常考。下期预告C 从 0 入门四类与对象进阶继承、多态 面试高频题收官篇

更多文章