协慌网

登录 贡献 社区

什么时候应该在 C ++ 中使用类 vs 结构?

在什么情况下在 C ++ 中使用struct vs class更好?

答案

C ++ 中的classstruct之间的差异是结构具有默认的public成员,而基类和类具有默认的private成员和基础。类和结构都可以包含public成员, protected成员和private成员,可以使用继承并且可以具有成员函数。

我建议使用结构作为普通旧数据结构,没有任何类似于类的特性,并使用类作为具有private数据和成员函数的聚合数据结构。

正如其他人所指出的那样,实际上只存在两种语言差异:

  • struct默认为公共访问, class默认为私有访问。
  • 继承时, struct默认为public inheritance, class默认为private inheritance。 (具有讽刺意味的是,与 C ++ 中的许多内容一样,默认是倒退的: public继承是目前比较常见的选择,但人们很少声明struct只是为了节省输入 “ public ” 关键字。

但实践中的真正区别在于声明构造函数 / 析构函数的class / struct与不声明构造函数 / 析构函数的class 。对于 “普通旧数据”POD 类型有一定的保证,一旦你接管了类的构造,它就不再适用了。为了保持这种区分,许多人故意只将struct用于 POD 类型,如果他们要添加任何方法,则使用class es。下面两个片段之间的区别是没有意义的:

class X
{
  public:

  // ...
};

struct X
{
  // ...
};

(顺便提一下,这里有一个关于 “POD 类型” 实际含义的一些好解释的线程: C ++ 中的 POD 类型是什么?

现有答案中存在许多误解。

classstruct声明了一个类。

是的,您可能必须在类定义中重新排列访问修改关键字,具体取决于您用于声明类的关键字。

但是,除了语法之外,选择一个而不是另一个的唯一原因是约定 / 样式 / 偏好。

有些人喜欢在没有成员函数的情况下坚持使用struct关键字,因为结果定义 “看起来像” 来自 C 的简单结构。

类似地,有些人喜欢将class关键字用于具有成员函数和private数据的类,因为它上面写着 “class”,因此看起来就像他们最喜欢的面向对象编程的书中的例子。

现实情况是,这完全取决于您和您的团队,这对您的计划来说几乎没有任何区别。

除了名称之外,以下两个类在各方面都是完全相同的:

struct Foo
{
   int x;
};

class Bar
{
public:
   int x;
};

您甚至可以在重新声明时切换关键字:

class Foo;
struct Bar;

(尽管由于不符合性而导致Visual Studio 构建中断 ,因此编译器会在您执行此操作时发出警告。)

并且以下表达式都评估为 true:

std::is_class<Foo>::value
std::is_class<Bar>::value

但请注意, 重新定义时无法切换关键字; 这只是因为(根据单一定义规则)跨翻译单元的重复类定义必须“由相同的标记序列组成” 。这意味着你甚至不能交换const int member;使用int const member; ,与classstruct的语义无关。