CC++ & Algorithm

类的定义与使用——像画图纸一样造对象

困难27
语言版本:C++Python
概述:学习如何用C++定义自己的类,像用图纸建造房子一样创建对象。

类的定义与使用——像画图纸一样造对象

小朋友,你有没有玩过乐高?每个乐高模型都有一张“图纸”,告诉你需要什么零件、怎么拼装。在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; 就错了类型 + 对象名,和普通变量一样
认为对象名可以相同同一作用域内对象名不能重复每个对象取不同的名字(如xiaomingxiaohong

8. 相关知识点指引

学会了类的定义与使用,你已经迈进了C++面向对象编程的大门。接下来你可以学习:

  • 构造函数:如何不用手动给成员变量赋值,一创建对象就自动初始化。
  • 封装:把成员变量设为private,用公开的函数去访问和修改,保护数据安全。
  • 继承:让一个类(比如“大学生类”)继承另一个类(“学生类”)的属性和方法,减少重复代码。
  • 析构函数:对象被销毁时自动执行的清理操作(比如释放内存)。

继续加油,你就能用类搭建出各种有趣的程序——从游戏角色到银行账户,都可以用“图纸+对象”的魔法实现!

例题精讲

1单选题

以下关于C++类的定义,正确的是哪一个?

Aclass Student { int age; void show(){} };
Bclass Student { private: int age; }
Cclass Student { public: void show(){} }
Dclass Student { public: int age; void show(){} };
2单选题

关于类的构造函数,下列说法正确的是?

A构造函数可以声明为虚函数
B构造函数可以有返回值,但通常省略
C构造函数可以被重载,即可以有多个构造函数
D构造函数不能使用默认参数
3判断题

在C++中,类的成员变量默认访问权限是public。

4填空题
以下是一个简单的Student类定义,请在横线处补全代码,使得setName函数能将传入的字符串赋值给私有成员变量name。

class Student {
private:
    string name;
    int age;
public:
    void setName(string n) {
        ___ = n;
    }
};
5填空题
已有Student类,包含公有成员函数void setName(string n)和void setAge(int a)。下面代码创建了一个Student对象并设置其姓名,请填空。

int main() {
    Student stu;
    stu.___("Tom");
    return 0;
}