一句话总结
C++ 的类(class)就是一张「图纸」,用来描述一类事物:这类事物有哪些特征(成员变量)、能做哪些动作(成员函数)。根据这张图纸,可以造出很多个对象(实例)。
类比: 类 = 房子图纸 对象 = 按照图纸盖出来的真实房子 一张图纸,可以盖出很多套房子。
1. 类的两大组成部分
- 成员变量(属性 / 特征):描述这个东西有什么数据。 比如人:姓名、年龄;汽车:颜色、速度。
- 成员函数(方法 / 行为):描述这个东西能干什么。 比如人:说话、走路;汽车:加速、刹车。
访问权限(新手记住 3 个)
public:公开,外面代码可以直接访问private:私有,只能类自己内部使用,外部不能访问(默认)protected:保护,只有自己和子类能用(初学暂时不用细抠)
2. 最简 C++ 类完整示例(不带 Qt,纯标准 C++)
我们定义一个「人类」的类:
#include <iostream> #include <string> using namespace std; // 这就是【类】:图纸 class Person { // 公开,外部可以调用 public: // 构造函数:新建对象的时候自动调用,用来初始化变量 Person(string name, int age) { m_name = name; m_age = age; } // 成员函数(行为) void sayHello() { cout << "大家好,我叫" << m_name << ",今年" << m_age << "岁" << endl; } // 私有属性,外部不能直接访问 private: string m_name; // 姓名(成员变量) int m_age; // 年龄(成员变量) }; int main() { // 根据类(图纸)创建【对象】 Person p1("张三", 20); Person p2("李四", 25); // 调用对象的函数 p1.sayHello(); p2.sayHello(); return 0; }运行输出:
大家好,我叫张三,今年20岁 大家好,我叫李四,今年25岁逐行解释
class Person:定义一个名叫 Person 的类(图纸)Person(string name, int age)→构造函数名字必须和类名一模一样。创建对象自动执行,用来给成员变量赋初始值。void sayHello():成员函数,是这个类具备的行为private里面的m_name、m_age:成员变量,保存这个对象的数据,外面不能直接读写Person p1("张三",20);:创建对象 p1,调用构造函数。p1 就是实例。
重点区分:
- 类:模板、图纸,是类型,不占内存
- 对象:根据类造出来的实体,占用内存,一个类可以创建无数对象
3. 什么是继承(C++ 原生继承,Qt 大量用到)
继承:一个类可以复用另一个类的代码,在原有基础上新增功能。
类比: 有一张【动物图纸】,然后【狗图纸】继承动物图纸,自带动物的属性,再增加狗独有的功能。
#include <iostream> using namespace std; // 父类(基类) class Animal { public: void eat() { cout << "动物会吃东西" << endl; } }; // 子类(派生类):公有继承Animal class Dog : public Animal { public: void bark() { cout << "汪汪叫" << endl; } }; int main() { Dog dog; dog.eat(); // 继承父类的函数 dog.bark(); // 自己新增的函数 return 0; }输出:
动物会吃东西 汪汪叫4. C++ 原生类 vs Qt 里继承 QObject 的类(重点!承接上一段内容)
| 项目 | 普通 C++ 类(上面 Person/Dog 例子) | Qt 继承 QObject 的类 |
|---|---|---|
| 基础来源 | 标准 C++ 原生语法 | 底层还是 C++ 类,只是继承了 Qt 的 QObject 类 |
| 信号槽 | ❌不支持 | ✅支持,需要写Q_OBJECT宏,moc 工具处理 |
| 内存管理 | new 创建对象,必须手动 delete 释放,否则内存泄漏 | new 时指定 parent 父对象,父销毁自动释放子对象 |
| 拷贝 | 支持对象拷贝赋值Person a = b; | ❌禁止拷贝,QObject 子类不能直接复制对象 |
| 元信息 | 运行时不知道类名 | 运行时可以查询类名、方法(元对象系统) |
一句话串联: Qt 的类本质就是 C++ 类,只是 Qt 写了一个叫 QObject 的 C++ 基类;我们自己写的类继承 QObject 之后,就额外获得信号槽、对象树这些 Qt 独有的能力。
5. 新手容易踩坑的点
- 类只是图纸,不创建对象,类里面的代码不会运行。
- private 私有成员,在 main 函数里不能直接写
p1.m_name="xxx",编译报错,只能通过类内函数访问。 - 构造函数没有返回值,名字必须和类名完全相同。
- C++ 继承 ≠ Qt 的 parent 对象父子关系!
- C++ 继承:类和类之间代码复用(图纸继承图纸)
- Qt parent:对象实例之间的归属关系,用来自动释放内存(房子归属于大楼)