C ++ 中的class
和struct
之间的差异是结构具有默认的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 类型是什么? )
现有答案中存在许多误解。
是的,您可能必须在类定义中重新排列访问修改关键字,具体取决于您用于声明类的关键字。
但是,除了语法之外,选择一个而不是另一个的唯一原因是约定 / 样式 / 偏好。
有些人喜欢在没有成员函数的情况下坚持使用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;
,与class
或struct
的语义无关。