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:对象实例之间的归属关系,用来自动释放内存(房子归属于大楼)
相关推荐
aqiu1111112 小时前
【C++算法打怪专栏】LeetCode 402. 移掉 K 位数字(单调栈 + 贪心)
c++·算法·leetcode
(Charon)2 小时前
【C++面试】线程并发与异步:区别、实现原理及使用场景
开发语言·c++
JMchen2 小时前
实战项目一——实现一个高性能图片滤镜App
android·c++·性能优化
码匠许师傅2 小时前
【C++三方组件】libpqxx:PostgreSQL 的 C++ 客户端
开发语言·c++·postgresql
H.莓飛3 小时前
【C++】内存管理
linux·开发语言·jvm·c++·visual studio
longlongzihan3 小时前
从LeetCode 19. 删除链表的倒数第 N 个结点深入理解“哨兵节点”
c++·算法·leetcode·链表
爱吃提升4 小时前
Dev-C++ 5.11 完整版快捷键大全(信奥/初学适用)
c语言·c++
SWAGGY..5 小时前
【C++进阶】:(10)哈希表的原理与实现——从哈希函数到哈希桶
c++·哈希算法·散列表
码匠许师傅5 小时前
【C++三方组件】redis-plus-plus:现代 Redis C++ 客户端
java·c++·redis