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

use*_*092 8 c++ standards struct class

我们知道,struct并且class可以在语言的许多地方互换.令人困惑的是,关键字本身并不一定与标准中使用的语言相对应.例如,在草案标准N4567 [class]/10中,

POD结构109是一个非工会类既是琐碎类和一个标准布局类,和具有类型的非POD结构,非POD联合(或这些类型的阵列)的无非静态数据成员.类似地,POD联合是一个简单的类和标准布局类的联合,并且没有非POD结构类型的非静态数据成员,非POD联合(或这种类型的数组).甲POD类是一类可以是一个POD结构或一个POD结合.

在过于简化的术语,struct并且class是在以下情况下可以互换:

  • 宣布"阶级"
  • 声明范围的枚举类型的声明
  • 详细说明了类型说明符,除非声明了"class" union

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

template <struct T> // error
Run Code Online (Sandbox Code Playgroud)

我无法看到之间的任何显著差异structclass,甚至在POD上面的例子,因为一个POD结构为界定标准,使用时请声明structclass.

[class]/8 标准布局结构是使用类键结构类键类定义的标准布局.甲 标准布局联盟是与定义的标准布局类类键联合.

这引起了明显的不一致,这似乎相当多余和令人困惑.

我有两个问题:

  1. 是否有任何技术差异,我错过了明显区分structclass

  2. 这种笨拙背后的理由是什么?

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

eer*_*ika 8

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

存在的原因struct是与C的兼容性.

那么,为什么"C with Classes" class在您可以使用struct相同的东西时引入新关键字,您可能会问.看到这个SO答案看似合情合理.简而言之,这可能是因为人们希望强调OOP,其中是一个广泛使用的术语.只有Stroustrup可能肯定知道.

令人困惑的是,关键字本身并不一定与标准中使用的语言相对应

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

声明类有三个关键字.这些被称为类键关键字class,structunion.除了之外,声明为具有classstruct完全相同的非联合类.联盟类与非联盟类不同.

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

C++在不同的上下文中为不同的目的重用关键字.class类声明上下文中的class关键字与模板参数定义中的关键字不完全相同.一个关键字在一个上下文中等同于另一个关键字并不会使其在所有上下文中都是等效的.在不同但相似的上下文中重用关键字的原因(static另一个例子)是避免引入新的关键字,这引入了更多与C(或更早的C++标准)兼容但没有新关键字的漏洞.

究其原因为什么 class关键字在模板类型参数的情况下重复使用可能是因为类类型,因此通常用作类型参数.还有一个typename关键字,后来添加,并且(几乎)可以与class模板类型参数声明互换,但也可以在别处使用(依赖类型名称),class而不使用.请参阅此答案,以获取有关为何将单独的关键字添加到该上下文的链接和摘要.

struct你可能会问,为什么不在上下文中使用它作为等价物.嗯,这是Stroustrup或委员会的另一个问题.这比当什么委员做了相反的选择enum class/ enum struct被引入.

我无法看到struct和class之间有任何显着差异

好.除了没有任何

这引起了明显的不一致,这似乎相当多余和令人困惑.

我认为标准的引用没有不一致.我看到冗余,我怀疑存在冗余,使得用关键字声明struct的类仍然是一个类更清楚.

  1. 我是否有任何技术差异可以明显区分结构和类?

我已经回答了,但要明确的是,使用和关键字声明的类之间没有区别,超出.structclass

与默认访问说明符的区别(如您所知,此处也有描述),这是它们唯一的区别.


101*_*010 5

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

struct 来自C,并且主要出于与C编程语言的兼容性而存在于C++中.

是否有任何技术差异,我错过了明显区分structclass

a struct和a 之间的主要区别在于,默认情况下class,struct其成员具有public访问权限,而class其成员则具有private访问权限.

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

至于为什么你不能使用struct关键字来指定非类型模板参数,原因是历史的,我想你必须要求Bjarne :)或者在幕后参考这个SO 答案.

  • @ user5817092`所有C程序都是有效的C++程序.**不对.一个典型的例子:`int*p = malloc(n*sizeof(int))` (6认同)