怎么写一个 class?怎么创建对象?成员变量和成员函数怎么用?this 指针又是什么?本节把这些最核心的用法一次讲清楚。
一个 class 由两部分组成:成员变量(存数据)和成员函数(定义操作)。写法如下:
| 1 | class Student { // class 关键字 + 类名 |
| 2 | public: // 访问权限(下一节详讲) |
| 3 | string name; // 成员变量:存储数据 |
| 4 | int score; |
| 5 | |
| 6 | void Print() { // 成员函数:定义操作 |
| 7 | cout << name << " : " << score << endl; |
| 8 | } |
| 9 | }; // ← 注意这里有分号! |
} 后面必须加分号 ;,这是 C++ 的语法要求,忘记写是新手最常犯的错误之一。类只是一张设计图,本身不占用数据空间。要真正使用它,需要创建对象——就像按照设计图造出一台实物。
创建对象的方式和定义普通变量一样,之后用 . 来访问它的成员:
| 1 | int 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。用 . 访问成员,就像用 [] 访问数组元素一样自然。每个对象都有自己独立的一份成员变量,修改 s1 的数据完全不影响 s2。可以用内存布局来理解:
三个对象在内存里各自占一块空间,彼此完全独立。但 Print() 这个函数的代码只有一份——调用 s1.Print() 和 s2.Print() 用的是同一段代码,只是操作的数据不同。
那函数怎么知道自己在操作的是 s1 还是 s2 的数据?答案就是下一节要讲的 this 指针。
每次调用成员函数时,C++ 会悄悄地把当前对象的地址作为一个隐藏参数传进去,这个隐藏参数就叫 this。
你可以把 this 理解为"我自己"——成员函数通过 this 来访问当前对象的数据。
s1.Print() 调用时,this 指向 s1,所以打印的是 "Alice : 95";s2.Print() 调用时,this 指向 s2,同一份代码打印的就是 "Bob : 82"。
大多数时候你不需要显式写出 this->,直接写成员名字就行,C++ 会自动理解。但有一种情况必须用到它——当函数参数名和成员变量名相同时:
| 1 | class Student { |
| 2 | public: |
| 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-> 或者换个参数名都完全没问题。当成员函数的代码比较长时,可以把声明写在类里,实现写在类外,用 类名:: 来说明这个函数属于哪个类。
| 1 | class Student { |
| 2 | public: |
| 3 | string name; |
| 4 | int score; |
| 5 | |
| 6 | void Print(); // 类内只写声明 |
| 7 | void SetScore(int s); // 类内只写声明 |
| 8 | }; |
| 9 | |
| 10 | // 类外写实现,用 Student:: 表示"属于 Student 类" |
| 11 | void Student::Print() { |
| 12 | cout << name << " : " << score << endl; |
| 13 | } |
| 14 | |
| 15 | void Student::SetScore(int s) { |
| 16 | if (s >= 0 && s <= 100) score = s; |
| 17 | } |
.h 头文件,实现放在 .cpp 文件,两者分离便于维护。