C++中的类或结构体:何时选择什么?核心问题解析

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

C++中的类或结构体:永恒的争论

\n\n

想象一下这个场景:你正在用C++编写代码,需要创建一个新的数据类型。脑海中立刻浮现出一个问题:“何时该使用class,何时该使用struct?”。这个问题不仅困扰着新手——在Stack Overflow上,它已经积累了数千次浏览和数十场激烈的讨论。这并不奇怪:因为在C++中,这两个关键字乍一看做的是同一件事,但存在细微差别。

\n\n

在本文中,我们将一劳永逸地弄清楚class和struct之间的真正区别,何时选择哪一个,以及如何避免出错。开始吧!

\n\n

主要区别:默认访问修饰符

\n\n

如果你认为class和struct是完全不同的实体,那你就错了。在C++中,它们之间唯一根本的区别是默认访问修饰符:

\n\n
    \n
  • struct:所有成员(字段和方法)默认是public(公有)。
  • \n
  • class:所有成员默认是private(私有)。
  • \n
\n\n

仅此而已。在语言层面上没有其他区别。没有性能差异,也没有魔法。只有访问权限。让我们通过示例来看看这是如何工作的。

\n\n

struct示例

\n
struct Point {\n    int x;\n    int y;\n};\n\n// 可以直接访问\nPoint p;\np.x = 10;\np.y = 20;
\n\n

class示例

\n
class Point {\n    int x;  // 默认是private(私有)!\n    int y;\npublic:\n    void setX(int val) { x = val; }\n    void setY(int val) { y = val; }\n};\n\nPoint p;\n// p.x = 10; // 错误!x是private(私有)\np.setX(10);   // 这样可以
\n\n

如你所见,区别仅在于你“默认”如何隐藏数据。但这并不意味着在class和struct之间的选择是个人喜好问题。有一些既定的实践。

\n\n

何时选择struct?

\n\n

在C++社区中,有一个不成文的共识:struct用于简单数据。当你的类型只是一组没有复杂逻辑的公有字段时,请使用struct。经典示例包括:

\n\n
    \n
  • 点的坐标(x, y)
  • \n
  • RGB颜色(r, g, b)
  • \n
  • 配置(width, height, title)
  • \n
  • 操作结果(success, errorMessage)
  • \n
\n\n

在这种情况下,不需要隐藏数据——它们本来就是公有的。struct使代码更简洁、更短。此外,struct非常适合POD类型(Plain Old Data,普通旧数据)——可以通过简单的memcpy复制的结构体。

\n\n

正确使用struct的示例

\n
struct Vector2 {\n    float x;\n    float y;\n    \n    // 可以添加简单的方法\n    float length() const {\n        return std::sqrt(x*x + y*y);\n    }\n};\n\n// 用作简单的数据容器\nVector2 v = {3.0f, 4.0f};\nstd::cout << v.length(); // 5.0
\n\n

请注意:即使struct有方法,这也是正常的。关键是字段保持公有,并且该类型不需要复杂的不变逻辑。

\n\n

何时选择class?

\n\n

Class是完整对象的默认选择。在以下情况下使用class:

\n\n
    \n
  • 你有需要封装的复杂逻辑。
  • \n
  • 你想严格控制数据如何被修改。
  • \n
  • 你的类型具有不变性(例如,“年龄不能为负数”)。
  • \n
  • 你使用继承、虚函数、多态。
  • \n
\n\n

一个经典的例子是“银行账户”类。余额不应该是公有的,否则有人可能会意外设置一个负值。

\n\n

正确使用class的示例

\n
class BankAccount {\nprivate:\n    double balance;\n    std::string owner;\n    \npublic:\n    BankAccount(const std::stri                

博客

书籍推荐