C++ 的类是什么(新手保姆讲解,配合 Qt 对照理解)

一句话总结

C++ 的类(class)就是一张「图纸」,用来描述一类事物:这类事物有哪些特征(成员变量)、能做哪些动作(成员函数)。 根据这张图纸,可以造出很多个对象(实例)。

类比: 类 = 房子图纸 对象 = 按照图纸盖出来的真实房子 一张图纸,可以盖出很多套房子。

1. 类的两大组成部分

  1. 成员变量(属性 / 特征):描述这个东西有什么数据。 比如人:姓名、年龄;汽车:颜色、速度。
  2. 成员函数(方法 / 行为):描述这个东西能干什么。 比如人:说话、走路;汽车:加速、刹车。

访问权限(新手记住 3 个)

  • public:公开,外面代码可以直接访问
  • private:私有,只能类自己内部使用,外部不能访问(默认)
  • protected:保护,只有自己和子类能用(初学暂时不用细抠)

2. 最简 C++ 类完整示例(不带 Qt,纯标准 C++)

我们定义一个「人类」的类:

cpp 复制代码
#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;
}

运行输出:

cpp 复制代码
大家好,我叫张三,今年20岁
大家好,我叫李四,今年25岁

逐行解释

  1. class Person:定义一个名叫 Person 的类(图纸)
  2. Person(string name, int age) → 构造函数 名字必须和类名一模一样。创建对象自动执行,用来给成员变量赋初始值。
  3. void sayHello():成员函数,是这个类具备的行为
  4. private里面的m_name、m_age:成员变量,保存这个对象的数据,外面不能直接读写
  5. Person p1("张三",20);:创建对象 p1,调用构造函数。p1 就是实例。

重点区分:

  • 类:模板、图纸,是类型,不占内存
  • 对象:根据类造出来的实体,占用内存,一个类可以创建无数对象

3. 什么是继承(C++ 原生继承,Qt 大量用到)

继承:一个类可以复用另一个类的代码,在原有基础上新增功能。

类比: 有一张【动物图纸】,然后【狗图纸】继承动物图纸,自带动物的属性,再增加狗独有的功能。

cpp 复制代码
#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. 新手容易踩坑的点

  1. 类只是图纸,不创建对象,类里面的代码不会运行。
  2. private 私有成员,在 main 函数里不能直接写 p1.m_name="xxx",编译报错,只能通过类内函数访问。
  3. 构造函数没有返回值,名字必须和类名完全相同。
  4. C++ 继承 ≠ Qt 的 parent 对象父子关系!
    • C++ 继承:类和类之间代码复用(图纸继承图纸)
    • Qt parent:对象实例之间的归属关系,用来自动释放内存(房子归属于大楼)
相关推荐
悠仁さん2 小时前
【C++】AVL 树
c++
wuminyu3 小时前
JVM规范学习总结:解释器与JIT编译器如何处理JVM字节码
java·linux·c语言·jvm·c++
小徐不徐说3 小时前
序列化与反序列化:把 C++ 对象可靠地保存下来
开发语言·数据库·c++·php
ragnwang3 小时前
Notes: Python pybind11 import C++ module
开发语言·c++·python
充值内卷5 小时前
我给桌面加了个鱼缸:C++ 写后端,WebView2 里养一座 Three.js 小岛
开发语言·javascript·c++
樱花树下的数学喵7 小时前
手写简易 STL string|C++ 字符串底层实现
开发语言·c++
AI吃大瓜8 小时前
指针压力表读数3:C/C++实现指针压力表读数(可实时检测)
c++·指针读数·指针压力表·压力表自动读数·压力表读数
-银雾鸢尾-8 小时前
两数之和-C++实现
c++·算法
j7~8 小时前
【动态规划算法专题】动态规划五部曲实战:泰波那契数、三步问题、最小花费爬楼梯
c++·算法·动态规划·数据结构与算法
jimy18 小时前
C++ 报错的 qualifiers 的意思
开发语言·c++