← 目录 / 第十二章 · 类与面向对象 / 12.2 类的定义与对象

12.2 类的定义与对象

怎么写一个 class?怎么创建对象?成员变量和成员函数怎么用?this 指针又是什么?本节把这些最核心的用法一次讲清楚。

本页目录
12.2.1 类的基本结构

一个 class 由两部分组成:成员变量(存数据)和成员函数(定义操作)。写法如下:

C++ · 类的基本结构
1class Student { // class 关键字 + 类名
2public: // 访问权限(下一节详讲)
3 string name; // 成员变量:存储数据
4 int score;
5
6 void Print() { // 成员函数:定义操作
7 cout << name << " : " << score << endl;
8 }
9}; // ← 注意这里有分号!
class Student { ... }; 成员变量(数据) string name; int score; 每个对象独立拥有一份 成员函数(操作) void Print() void SetScore() 所有对象共用同一份代码
类由成员变量成员函数两部分组成。
成员变量每个对象各有一份(每个学生的 name、score 都不一样);成员函数的代码只有一份,所有对象共用。
⚠️
类定义的最后一个 } 后面必须加分号 ;,这是 C++ 的语法要求,忘记写是新手最常犯的错误之一。
12.2.2 创建对象与调用成员

类只是一张设计图,本身不占用数据空间。要真正使用它,需要创建对象——就像按照设计图造出一台实物。

创建对象的方式和定义普通变量一样,之后用 . 来访问它的成员:

C++ · 创建对象与调用成员
1int main() {
2 Student s1; // 创建一个 Student 对象,名字叫 s1
3
4 s1.name = "Alice"; // 用 . 访问成员变量
5 s1.score = 95;
6 s1.Print(); // 用 . 调用成员函数 → 输出:Alice : 95
7
8 Student s2; // 再创建一个对象 s2,与 s1 完全独立
9 s2.name = "Bob";
10 s2.score = 82;
11 s2.Print(); // 输出:Bob : 82
12}
💡
类比记忆:Student s1 就像 int x——只不过类型从内置的 int 换成了你自己定义的 Student。用 . 访问成员,就像用 [] 访问数组元素一样自然。
12.2.3 多个对象互相独立

每个对象都有自己独立的一份成员变量,修改 s1 的数据完全不影响 s2。可以用内存布局来理解:

s1(Student)
name "Alice"
score 95
s2(Student)
name "Bob"
score 82
s3(Student)
name "Carol"
score 77

三个对象在内存里各自占一块空间,彼此完全独立。但 Print() 这个函数的代码只有一份——调用 s1.Print()s2.Print() 用的是同一段代码,只是操作的数据不同。

那函数怎么知道自己在操作的是 s1 还是 s2 的数据?答案就是下一节要讲的 this 指针。

12.2.4 this 指针是什么

每次调用成员函数时,C++ 会悄悄地把当前对象的地址作为一个隐藏参数传进去,这个隐藏参数就叫 this

你可以把 this 理解为"我自己"——成员函数通过 this 来访问当前对象的数据。

s1 name = "Alice" score = 95 s2 name = "Bob" score = 82 void Print() cout << this->name << this->score; s1.Print() this = &s1 s2.Print() this = &s2 同一份代码,this 不同
s1.Print() 调用时,this 指向 s1,所以打印的是 "Alice : 95";
s2.Print() 调用时,this 指向 s2,同一份代码打印的就是 "Bob : 82"。

大多数时候你不需要显式写出 this->,直接写成员名字就行,C++ 会自动理解。但有一种情况必须用到它——当函数参数名和成员变量名相同时:

C++ · this 的典型用法
1class Student {
2public:
3 string name;
4 int score;
5
6 void SetScore(int score) { // 参数名和成员名都叫 score
7 score = score; // ❌ 错!两个 score 都指参数,成员没被赋值
8 this->score = score; // ✅ 对!this->score 是成员,右边 score 是参数
9 }
10};
📌
习惯做法:为了避免这类混淆,很多人会给成员变量加前缀(如 m_score)或后缀(如 score_),这样参数名和成员名就不会冲突,就不需要 this-> 了。在竞赛里,用 this-> 或者换个参数名都完全没问题。
12.2.5 在类外定义成员函数

当成员函数的代码比较长时,可以把声明写在类里,实现写在类外,用 类名:: 来说明这个函数属于哪个类。

C++ · 类内声明 + 类外实现
1class Student {
2public:
3 string name;
4 int score;
5
6 void Print(); // 类内只写声明
7 void SetScore(int s); // 类内只写声明
8};
9
10// 类外写实现,用 Student:: 表示"属于 Student 类"
11void Student::Print() {
12 cout << name << " : " << score << endl;
13}
14
15void Student::SetScore(int s) {
16 if (s >= 0 && s <= 100) score = s;
17}
📖
什么时候用类外定义?
・竞赛中:函数短小时直接写在类里,简洁优先。
・工程项目中:通常把类的声明放在 .h 头文件,实现放在 .cpp 文件,两者分离便于维护。
两种写法效果完全一样,选自己习惯的即可。