C++中的类或结构体:永恒的争论
\n\n想象一下这个场景:你正在用C++编写代码,需要创建一个新的数据类型。脑海中立刻浮现出一个问题:“何时该使用class,何时该使用struct?”。这个问题不仅困扰着新手——在Stack Overflow上,它已经积累了数千次浏览和数十场激烈的讨论。这并不奇怪:因为在C++中,这两个关键字乍一看做的是同一件事,但存在细微差别。
\n\n在本文中,我们将一劳永逸地弄清楚class和struct之间的真正区别,何时选择哪一个,以及如何避免出错。开始吧!
主要区别:默认访问修饰符
\n\n如果你认为class和struct是完全不同的实体,那你就错了。在C++中,它们之间唯一根本的区别是默认访问修饰符:
- \n
- struct:所有成员(字段和方法)默认是
public(公有)。 \n - class:所有成员默认是
private(私有)。 \n
仅此而已。在语言层面上没有其他区别。没有性能差异,也没有魔法。只有访问权限。让我们通过示例来看看这是如何工作的。
\n\nstruct示例
\nstruct Point {\n int x;\n int y;\n};\n\n// 可以直接访问\nPoint p;\np.x = 10;\np.y = 20;\n\nclass示例
\nclass 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
在这种情况下,不需要隐藏数据——它们本来就是公有的。struct使代码更简洁、更短。此外,struct非常适合POD类型(Plain Old Data,普通旧数据)——可以通过简单的memcpy复制的结构体。
正确使用struct的示例
\nstruct 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有方法,这也是正常的。关键是字段保持公有,并且该类型不需要复杂的不变逻辑。
何时选择class?
\n\nClass是完整对象的默认选择。在以下情况下使用class:
- \n
- 你有需要封装的复杂逻辑。 \n
- 你想严格控制数据如何被修改。 \n
- 你的类型具有不变性(例如,“年龄不能为负数”)。 \n
- 你使用继承、虚函数、多态。 \n
一个经典的例子是“银行账户”类。余额不应该是公有的,否则有人可能会意外设置一个负值。
\n\n正确使用class的示例
\nclass BankAccount {\nprivate:\n double balance;\n std::string owner;\n \npublic:\n BankAccount(const std::stri