为什么C++中同时存在结构体和类?
存在的理由struct
是为了与C兼容。
那么为什么“C with Classes”引入了 new 关键字class
当你可以使用struct
对于同样的事情,你可能会问。看到这个所以答案为了合理的猜测。简而言之,这可能是因为人们希望强调OOP其中class是一个广泛使用的术语。只有斯特鲁斯特鲁普可能确切知道。
令人困惑的是,关键字本身不一定对应于标准中使用的语言
需要理解的是,a 的概念class与关键字不相同class
.
There are three keywords for declaring classes. These keywords known as class-keys are class
, struct
and union
. The non-union classes that are declared with either class
or struct
are exactly the same thing, except for †. Union classes are different from non-union classes.
但是,不能在模板声明中显式使用 struct 来引入类型模板参数
C++ 在不同的上下文中出于不同的目的重复使用关键字。class
类声明上下文中的关键字不完全相同class
模板参数定义中的关键字。一个关键字在一种上下文中与另一个关键字等效并不意味着它在所有上下文中都等效。在不同但相似的上下文中重复使用关键字的原因(static
是另一个例子),是为了避免引入新的关键字,这会引入更多与没有新关键字的 C(或早期 C++ 标准)的兼容性漏洞。
原因why class
在模板类型参数的上下文中重用关键字可能是因为类是类型,因此通常用作类型参数。还有一个typename
关键字,后来添加的并且(几乎)可以与class
在模板类型参数声明中,但也在其他地方使用(依赖类型名称),其中class
未使用。看到这个answer有关为什么将单独的关键字添加到该上下文的链接和摘要。
Why struct
您可能会问,在上下文中没有作为等效项使用。嗯,这是斯特劳斯特鲁普或委员会的另一个问题。这与委员会当时所做的选择相反enum class
/enum struct
被介绍了。
我看不出结构和类之间有任何显着差异
Good. There isn't any except for †
这看起来相当多余和令人困惑,同时引入了明显的不一致。
我认为标准的引用没有不一致之处。我看到了冗余,并且我怀疑冗余的存在是为了更加清楚地表明用关键字声明的类struct
仍然是一个类。
- 我是否遗漏了任何明显区分结构和类的技术差异?
I've already answered, but to be clear, there is no difference between classes declared with struct
and class
keywords, beyond †.
† the difference with the default access specifier (as you already know, and also described here), which is their only difference.