为什么C ++中都存在struct和class?

Why do both struct and class exist in C++?

如我们所知,structclass在语言的许多地方是可互换的。令人困惑的是,关键字本身并不一定与标准中使用的语言对应。例如,在标准草案N4567[等级]/10中,

A POD struct109 is a non-union class that is both a
trivial class and a standard-layout class, and has no non-static data
members of type non-POD struct, non-POD union (or array of such
types). Similarly, a POD union is a union that is both a trivial
class and a standard-layout class, and has no non-static data members
of type non-POD struct, non-POD union (or array of such types). A POD
class is a class that is either a POD struct or a POD union.

在过度简化的情况下,在以下情况下,structclass可以互换:

  • "类"的声明
  • 作用域枚举类型的声明
  • 详细的类型说明符,除非"class"是用union声明的

但是,在模板声明中不能显式使用struct来引入类型模板参数:

1
template <struct T> // error

我看不出structclass之间有什么显著的区别,即使在上面的pod示例中,因为标准中定义的pod结构可以用structclass声明。

[class]/8 A standard-layout struct is a standard-layout class
defined with the class-key struct or the class-key class. A
standard-layout union is a standard-layout class defined with the class-key union.

在引入明显的不一致性的同时,这看起来相当冗长和混乱。

我有两个问题:

  • 我是否遗漏了明显区分structclass的技术差异?

  • 这种笨拙背后的原因是什么,如果有的话?

  • 我忽略了默认访问说明符之间的区别,因为每个人都已经知道了。


    Why do both struct and class exist in C++?

    存在struct的一个原因是与c兼容。

    那么,"c with classes"为什么会引入新的关键字class,当你可以用struct来做同样的事情时,你可能会问。看看这个答案是否有合理的推测。简而言之,这可能是因为有人希望强调OOP,在OOP中,类是一个广泛使用的术语。只有斯特劳斯鲁普可以肯定地知道。

    Confusingly, the keywords themselves do not necessarily correspond to the language used in the standard

    需要理解的是,类的概念与关键字class不同。

    声明类有三个关键字。这些被称为类键的关键字是classstructunion。用classstruct声明的非联合类完全相同,除了?.Union类与非Union类不同。

    However, struct explicitly cannot be used in a template declaration to introduce type template parameters

    C++在不同的上下文中使用不同目的的关键字。类声明上下文中的class关键字与模板参数定义中的class关键字不完全相同。一个关键字在一个上下文中等价于另一个关键字,并不能使它在所有上下文中都等价。在不同但相似的上下文中重用关键字的原因(EDOCX1,21)是另一个例子,避免引入新的关键字,它引入了与C(或较早的C++标准)不具有新关键字的兼容性的更多的空洞。

    在模板类型参数的上下文中重用class关键字的原因可能是类是类型,因此通常用作类型参数。还有一个typename关键字,稍后添加,在模板类型参数声明中(几乎)可以与class互换,但在不使用class的其他地方(依赖类型名称)也可以使用。请参阅此答案以获取一个链接和一个关于为什么将单独的关键字添加到该上下文的摘要。

    你可能会问,为什么struct没有在上下文中用作等价物。好吧,这是斯特劳斯特普或委员会的另一个问题。这是一个与委员会在引入enum classenum struct时所做的相反的选择。

    I'm unable to see any significant difference between struct and class

    很好。除了什么都没有?

    This seems rather redundant and confusing while introducing a glaring inconsistency.

    我看不出标准的引用有任何不一致之处。我看到了冗余,我怀疑冗余的存在是为了更加清楚地表明,用关键字struct声明的类仍然是一个类。

  • Are there any technical differences that I have missed that significantly distinguish struct and class?
  • 我已经回答过了,但是很明显,用structclass关键字声明的类之间没有区别,除了?.

    ?与默认访问说明符的区别(正如您已经知道的,这里也描述了),这是它们唯一的区别。


    Why do both struct and class exist in C++?

    EDCOX1〔0〕来源于C,主要存在于C++中,与C语言兼容。

    Are there any technical differences that I have missed that
    significantly distinguish struct and class?

    structclass的主要区别在于,对于struct而言,默认情况下,其成员具有public访问权限,而对于class而言,其成员具有private访问权限。

    模板参数中使用的关键字class不是定义类,而是非类型模板参数,可以与关键字typename互换使用。

    至于为什么不能使用struct关键字来指定非类型模板参数,原因是历史性的,我想您必须向bjarne索要它:)或者参阅此答案了解幕后信息。