一、上期回顾
掌握核心:类与对象、构造 / 析构、拷贝构造、this 指针、初始化列表。今天主攻:封装完整落地 + static 静态成员 + 生命周期。
二、封装核心原理
1. 封装定义
- 将成员变量私有化
- 对外只暴露公有成员函数作为访问接口
- 屏蔽内部实现细节,防止外部非法修改
2. 三大访问权限汇总
表格
| 权限 | 访问范围 |
|---|---|
| private | 仅本类内部(默认) |
| public | 任意位置访问 |
| protected | 本类 + 子类(继承用) |
3. 标准封装写法
-
成员变量全部
private -
提供
set / get函数读写 -
数据校验写在 set 中,保证数据合法
#include <iostream>
using namespace std;class Student
{
private:
int id;
int score;public:
// 写入+数据校验
void setScore(int s)
{
if(s >= 0 && s <= 100)
score = s;
else
score = 0;
}int getScore() { return score; } void setId(int i) { id = i; } int getId() { return id; }};
三、static 静态成员(重点)
1. 静态成员变量
-
不属于单个对象,属于整个类
-
全局只开辟一份内存,所有对象共享
-
必须类外初始化
class Person
{
public:
static int count; // 静态成员声明
Person()
{
count++;
}
};// 类外初始化
int Person::count = 0;
2. 静态成员函数
-
只能访问静态成员
-
没有 this 指针
-
可通过 类名:: 直接调用
class Person
{
public:
static int cnt;
static void showCnt()
{
cout << cnt << endl;
}
};// 调用方式
Person::showCnt();
四、static 完整演示代码
#include <iostream>
using namespace std;
class Person
{
private:
int age;
public:
static int num;
Person()
{
age = 0;
num++;
}
~Person()
{
num--;
}
static void printNum()
{
cout << "当前对象数量:" << num << endl;
}
};
// 静态变量全局初始化
int Person::num = 0;
int main()
{
Person p1;
Person::printNum();
Person p2;
Person::printNum();
return 0;
}
运行结果:
当前对象数量:1
当前对象数量:2
五、对象生命周期详解
1. 栈对象(普通定义)
Person p;
- 生命周期:所在代码块内
- 出作用域自动调用析构、自动释放
- 开销小,常用
2. 堆对象(new 创建)
Person* p = new Person;
delete p;
- 生命周期:手动控制
- 不 delete 不会自动析构,造成内存泄漏
- 适合大型对象、跨函数使用
3. 全局对象
Person g_p;
int main(){}
- 生命周期:整个程序运行期间
- 程序启动先构造,程序结束后析构
六、const 修饰成员(拓展必背)
-
const 成员函数不修改任何成员变量,只读函数
void show() const
{
cout << age << endl;
} -
const 对象只能调用 const 成员函数
七、今日核心总结
- 封装:变量私有、接口公有、数据校验,工程规范必备
- static 成员:类共享、单份内存、统计对象数量常用
- 静态函数:无 this、只能访问静态变量
- 三种对象:栈 / 堆 / 全局,生命周期完全不同
八、今日练习
- 写一个 Student 类,全部成员私有化
- 用 static 统计一共实例化多少学生对象
- 分别创建栈对象、堆对象,观察构造与析构调用次数