一、上期回顾
C 面向过程、C++ 面向对象;C++ 新增:命名空间、cin/cout、new/delete、权限控制。今天正式进入C++ 面向对象核心:类与对象。
二、类与对象核心概念
- 类(class):抽象模板,描述事物属性与行为
- 对象:类的实例,实实在在开辟内存
- 访问权限
private:私有,仅类内访问(默认)public:公有,外部可直接访问protected:保护,继承场景使用
核心思想:数据封装成员变量私有,对外只提供公开接口,保证数据安全。
三、最简类定义示范
#include <iostream> using namespace std; class Person { // 私有成员 private: int age; // 公开接口 public: // 成员函数 void setAge(int a) { age = a; } void show() { cout << "age = " << age << endl; } }; int main() { // 实例化对象 Person p; p.setAge(20); p.show(); // 错误:age 是 private 无法直接访问 // p.age = 18; return 0; }四、构造函数
作用
对象创建时自动调用,负责初始化成员。
特点
- 函数名与类名完全相同
- 无返回值
- 可重载
- 不写则编译器提供默认无参构造
1. 无参构造
class Person { private: int age; public: // 无参构造 Person() { age = 0; cout << "无参构造执行" << endl; } };2. 有参构造
Person(int a) { age = a; cout << "有参构造执行" << endl; }3. 初始化列表(推荐写法)
效率更高,直接初始化,不先创建再赋值:
Person(int a) : age(a) { }五、析构函数
作用
对象销毁时自动调用,释放堆内存、关闭资源。
特点
- 名前加
~ - 无参、无返回、不能重载
- 编译器会提供默认析构
class Person { public: // 析构函数 ~Person() { cout << "析构函数执行" << endl; } };栈对象:出作用域自动析构堆对象:
delete时触发析构
六、拷贝构造函数
触发场景
用已有对象初始化新对象时自动调用。
格式
类名(const 类名& 旧对象)
class Person { private: int age; public: Person(int a) : age(a) {} // 拷贝构造 Person(const Person& other) { age = other.age; cout << "拷贝构造执行" << endl; } void show() { cout << age << endl; } }; int main() { Person p1(18); Person p2 = p1; // 触发拷贝构造 p2.show(); return 0; }默认拷贝构造
编译器默认提供浅拷贝:逐字节赋值。后续深度讲解:浅拷贝 与 深拷贝 内存坑。
七、this 指针
- 每一个成员函数隐含
this指针 - 指向当前调用的对象
- 解决成员变量与局部变量重名
void setAge(int age) { this->age = age; }八、完整整合代码
#include <iostream> using namespace std; class Person { private: int age; public: // 无参构造 Person() : age(0) { cout << "无参构造" << endl; } // 有参构造 Person(int a) : age(a) { cout << "有参构造" << endl; } // 拷贝构造 Person(const Person& p) { this->age = p.age; cout << "拷贝构造" << endl; } // 析构 ~Person() { cout << "析构函数" << endl; } void show() { cout << "age = " << age << endl; } }; int main() { Person p1; Person p2(22); Person p3 = p2; p1.show(); p2.show(); p3.show(); return 0; }九、今日核心总结
- 类是模板,对象是实例;private 保护数据
- 构造:创建对象初始化
- 析构:销毁对象释放资源
- 拷贝构造:对象赋值初始化触发
this指针代表当前对象
十、课后练习
- 自定义 Student 类,包含:姓名、学号
- 手写:无参构造、有参构造、拷贝构造、析构
- 利用
this指针解决变量名冲突