一、上期回顾
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指针解决变量名冲突