【QT】-QT为啥喜欢用类而不是结构体

Qt 为什么用 class 而不是 struct 封装 QPoint、QRect 等?

这是个很有深度的设计问题!答案涉及 C++ 历史、Qt 哲学、二进制兼容性 等。

首先澄清:QPoint 其实"像 struct",但声明为 class

在 Qt 源码中,QPoint 是这样定义的(简化):

cpp 复制代码
class QPoint {
public:
    int x, y;
    QPoint() : x(0), y(0) {}
    QPoint(int xpos, int ypos) : x(xpos), y(ypos) {}
    // 各种运算符重载:+、-、== 等
};

虽然用 class 关键字,但:

所有成员都是 public

没有虚函数

没有复杂逻辑

行为上完全像 C 的 struct

那为什么不用 struct?

  1. C++ 中 class 和 struct 几乎一样
    唯一区别:默认访问权限(class 默认 private,struct 默认 public)
    Qt 选择 class 是为了 统一风格 ------ Qt 中几乎所有类型都是 class,包括简单类型。
  2. 历史与兼容性考虑
    Qt 诞生于 1990 年代,当时 C++ 编译器对 struct 支持不如现在稳定。
    用 class 更"面向对象",符合 Qt 的设计理念(即使简单类型也提供方法)。
  3. 未来可扩展性
    今天 QPoint 很简单,但未来可能需要:
    添加方法(如 QPoint::manhattanLength())
    支持隐式共享(像 QVector 那样)
    适配高 DPI(虽然现在还是整数)
    用 class 可以在不破坏 ABI 的情况下加 private 成员(struct 通常被视为 POD,加成员会破坏内存布局)。
  4. Qt 的哲学:一切皆对象
    Qt 希望即使是坐标、矩形这样的"值类型",也能有方法和行为:
cpp 复制代码
QPoint p(10, 20);
p += QPoint(5, 5);     // 运算符重载
int len = p.manhattanLength(); // 方法

这比纯 C 风格的 struct + 全局函数更面向对象。

  1. 与 QObject 体系保持一致

虽然 QPoint 不是 QObject,但 Qt 整体 API 风格统一用 class,降低用户认知负担。

Qt 选择了更现代、更安全、更易用的面向对象封装。

总结

为什么用class而不是struct?

  1. 统一 Qt 风格
  2. 支持方法和运算符重载
  3. 便于未来扩展
  4. 符合面向对象设计
  5. 历史和 ABI 兼容性考虑

小知识:在 Qt 中,QPoint、QSize、QRect 等被称为 "值类型(value types)",它们设计得像 int 一样轻量、可复制,但又有面向对象的便利性。

相关推荐
布莱克6051 小时前
C/C++ 中变量的声明与定义:区别、联系与常见误区
c语言·开发语言·c++·声明·定义
LabVIEW开发2 小时前
LabVIEW 局部变量为何引发竞争条件?四种同步机制
开发语言·labview
benchmark_cc2 小时前
A 股、港股、美股如何建立统一的标的主数据格式?
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
Zenova EdgeOS3 小时前
Go 工业边缘错误处理实战:用 errors 构建可追溯错误链
开发语言·数据库·golang
取名真是4 小时前
Python 算法知识点从基础到进阶
开发语言·python·算法
FRing034 小时前
vue2干货总结3(computed计算属性、watch监听器)
开发语言·前端·vue.js·vue2
Fatbobman(东坡肘子)5 小时前
快速消失的硬盘容量 -- 肘子的 Swift 周报 #160
开发语言·人工智能·redis·ios·swiftui·iphone·swift
揽星河..5 小时前
【C语言】底层程序设计
c语言·开发语言
JavaPub-rodert5 小时前
从零搭建通用管理后台:ShiyuAdmin 的 Go、React 与 RBAC 实践
开发语言·react.js·golang
海的透彻6 小时前
dockerfile如何快速构建容器(java服务)
java·开发语言