什么时候应该在C ++中使用类和结构?
在哪种情况下最好在C ++中使用struct
与class
?
C ++中class
和struct
之间的区别在于,结构具有默认的public
成员,并且基类和类具有默认的private
成员和基础。 类和结构都可以有public
成员和private
成员的混合,可以使用继承并可以具有成员函数。
我会推荐使用结构作为普通的旧数据结构,没有任何类特征,并将类用作具有private
数据和成员函数的聚合数据结构。
正如其他人所指出的,实际上只有两种语言差异:
struct
默认为公共访问, class
默认为私有访问。 struct
默认为public
继承, class
默认为private
继承。 (具有讽刺意味的是,与C ++中的许多事情一样,默认值是倒退: public
继承是更常用的选择,但人们很少声明struct
s只是为了节省输入“ public
”关键字。 但实际上的真正区别在于声明构造函数/析构函数的class
/ struct
和不具有构造函数/析构函数的class
/ struct
之间。 对于“普通旧数据”POD类型有一定的保证,一旦接管课程结构就不再适用。 为了保持这种区分清晰,许多人故意只使用POD类型的struct
s,并且如果他们打算添加任何方法,则使用class
es。 下面这两个片段之间的区别是没有意义的:
class X
{
public:
// ...
};
struct X
{
// ...
};
(顺便提一下,下面是一个关于“POD类型”实际意义的一些很好解释的线程:C ++中的POD类型是什么?)
现有答案中有很多误解。
class
和struct
声明一个类。
是的,您可能需要重新排列类定义中的访问修改关键字,具体取决于您用于声明类的关键字。
但是,除了语法之外,选择其中一个的唯一理由是约定/风格/偏好。
有些人喜欢在不使用成员函数的情况下坚持使用struct
关键字,因为结果定义“看起来像”一个来自C的简单结构。
同样,有些人喜欢将class
关键字用于具有成员函数和private
数据的类,因为它上面写着“class”,因此看起来就像他们最喜欢的面向对象编程的书中的例子。
现实情况是,这完全取决于你和你的团队,并且它对你的程序没有任何影响。
除了他们的名字以外,以下两类在各方面都是绝对相同的:
struct Foo
{
int x;
};
class Bar
{
public:
int x;
};
您可以在重新声明时切换关键字:
class Foo;
struct Bar;
(尽管一些编译器会在你这样做的时候发出警告,假设你可能不打算做一些令人困惑的事情,因此应该提示你仔细检查你的代码。)
并且以下表达式都计算为真:
std::is_class<Foo>::value
std::is_class<Bar>::value
但请注意,重新定义时不能切换关键字; 这只是因为(根据单定义规则)跨转换单元的重复类定义必须“由相同的标记序列组成”。 这意味着你甚至不能交换const int member;
与int const member;
,并且与class
或struct
的语义无关。