类的定义与使用——像画图纸一样造对象
困难27类的定义与使用——像画图纸一样造对象
小朋友,你有没有玩过乐高?每个乐高模型都有一张“图纸”,告诉你需要什么零件、怎么拼装。在C++里,“类”就像一张图纸,它规定了一个物品有哪些数据(比如颜色、大小)和能做什么动作(比如跑、跳)。用这张图纸做出来的具体东西就叫做“对象”。
学习类(class)之后,你就能把现实中的事物——学生、小狗、游戏角色、甚至你存的零花钱罐——用代码“画”出来,让程序变得更像真实世界。
1. 什么是类?什么是对象?
类是用户自定义的数据类型,它把相关的数据(属性)和操作(方法)打包在一起。
对象是类的一个具体实例,就像用模具印出来的饼干——每个饼干都有自己的花纹,但都按同一个模具的形状。
举个你身边熟悉的例子:假设你班里有很多同学,每个同学都有姓名、年龄,还能做自我介绍。
这些共同的“特征”和“行为”可以抽象成一个“学生类”。然后每个真实的同学就是“学生类”的一个对象。
2. 定义第一个类:学生类
我们先把上面的想法写成代码。下面的代码定义了一个Student类,它有两个成员变量(name 和 age)和一个成员函数(introduce)。
#include <iostream>
#include <string>
using namespace std;
class Student {
public: // 公开的,外面可以访问
string name; // 成员变量:姓名
int age; // 成员变量:年龄
void introduce() { // 成员函数:自我介绍
cout << "大家好,我是" << name << ",今年" << age << "岁。" << endl;
}
};
int main() {
Student xiaoming; // 用类创建对象(像用图纸造出具体的人)
xiaoming.name = "小明"; // 给对象的变量赋值
xiaoming.age = 10;
xiaoming.introduce(); // 调用对象的方法
return 0;
}
运行后,屏幕上会显示:“大家好,我是小明,今年10岁。”
你看,class 就是定义类用的关键字;public 表示后面的成员谁都可以用(就像图纸上的公开信息);introduce 是类里的函数,叫做“成员函数”。我们把学生共有的属性和动作打包在一起,以后就可以轻松创建很多学生对象,比如小红、小刚,每个对象都有自己的名字和年龄。
3. 属性(成员变量)和方法(成员函数)
类里主要有两种东西:
- 成员变量:描述“它有什么”。比如学生的姓名(
string name)、年龄(int age)。每个对象的成员变量可以有不同的值。 - 成员函数:描述“它能做什么”。比如自我介绍(
void introduce())。成员函数可以访问自己对象里的成员变量。
生活中的类比
想象你设计一个“游戏英雄”的类:
- 属性:血量(
int hp)、攻击力(int attack)、名字(string name) - 方法:攻击(
attackEnemy())、使用技能(useSkill())
每个英雄对象(比如“剑士小明”和“法师小红”)都有自己的血量,也能调用攻击方法,彼此互不干扰。
4. public 与 private——控制访问权限
上面的代码里我们用了public,意思是这些成员在类外面(比如main函数)可以直接使用。
C++中,类里的成员默认是private(私有的),只有类内部的函数才能访问。如果忘记写public:,会出现编译错误。
举个例子,错误写法
class Student {
string name; // 默认private,外面无法直接使用
int age;
void introduce() { ... }
};
// 在main里写 xiaoming.name = "小明"; 会报错!
所以写类时,通常把想要暴露给外界的接口(成员函数)放在public下,把不想被随意改动的数据放在private下(后面学“封装”时会了解更多)。
5. 创建多个对象——每个对象独立
一个类可以造出无数个对象,每个对象拥有自己的数据副本。修改小明不会影响小红。
int main() {
Student xiaoming;
xiaoming.name = "小明";
xiaoming.age = 10;
Student xiaohong; // 再创建一个小红对象
xiaohong.name = "小红";
xiaohong.age = 9;
xiaoming.introduce(); // 输出:大家好,我是小明,今年10岁。
xiaohong.introduce(); // 输出:大家好,我是小红,今年9岁。
return 0;
}
每个对象就像一张独立的表格,填着不同数据。
6. 完整可运行的代码示例
下面是一个更完整的“学生类”程序,包含了多个对象和一条错误注释提醒。
#include <iostream>
#include <string>
using namespace std;
class Student {
public: // 公开访问
string name; // 成员变量:姓名
int age; // 成员变量:年龄
// 成员函数:自我介绍
void introduce() {
cout << "大家好,我是" << name << ",今年" << age << "岁。" << endl;
}
// 成员函数:过生日(年龄加1)
void haveBirthday() {
age = age + 1;
cout << name << "过生日啦!现在" << age << "岁。" << endl;
}
};
int main() {
Student xiaoming; // 创建小明的对象
xiaoming.name = "小明";
xiaoming.age = 10;
Student xiaohong; // 创建小红的对象
xiaohong.name = "小红";
xiaohong.age = 9;
// 调用函数
xiaoming.introduce();
xiaohong.introduce();
xiaoming.haveBirthday(); // 小明长大一岁
xiaohong.introduce(); // 小红没变化,还是9岁
return 0;
}
运行结果:
大家好,我是小明,今年10岁。
大家好,我是小红,今年9岁。
小明过生日啦!现在11岁。
大家好,我是小红,今年9岁。
7. 常见错误(新手容易掉坑)
| 错误 | 说明 | 正确做法 |
|---|---|---|
忘记写 public: | 成员默认private,外面无法访问 | 在需要公开的成员前写上 public:(别忘了冒号) |
| 类定义末尾忘记加分号 | C++中类定义后面必须有分号 ; | 写完右花括号后马上写 ; |
| 成员函数里用错变量名 | 比如把 name 写成 names | 检查拼写,成员函数可以直接使用本类的成员变量 |
| 创建对象时忘记写类名 | 写成 Student xiaoming; 正确,但写成 xiaoming Student; 就错了 | 类型 + 对象名,和普通变量一样 |
| 认为对象名可以相同 | 同一作用域内对象名不能重复 | 每个对象取不同的名字(如xiaoming和xiaohong) |
8. 相关知识点指引
学会了类的定义与使用,你已经迈进了C++面向对象编程的大门。接下来你可以学习:
- 构造函数:如何不用手动给成员变量赋值,一创建对象就自动初始化。
- 封装:把成员变量设为
private,用公开的函数去访问和修改,保护数据安全。 - 继承:让一个类(比如“大学生类”)继承另一个类(“学生类”)的属性和方法,减少重复代码。
- 析构函数:对象被销毁时自动执行的清理操作(比如释放内存)。
继续加油,你就能用类搭建出各种有趣的程序——从游戏角色到银行账户,都可以用“图纸+对象”的魔法实现!
例题精讲
以下关于C++类的定义,正确的是哪一个?
关于类的构造函数,下列说法正确的是?
在C++中,类的成员变量默认访问权限是public。
以下是一个简单的Student类定义,请在横线处补全代码,使得setName函数能将传入的字符串赋值给私有成员变量name。
class Student {
private:
string name;
int age;
public:
void setName(string n) {
___ = n;
}
};已有Student类,包含公有成员函数void setName(string n)和void setAge(int a)。下面代码创建了一个Student对象并设置其姓名,请填空。
int main() {
Student stu;
stu.___("Tom");
return 0;
}