struct
默认是公开的,而默认情况下class
是私有的。
让我们以Ogre3D为例;如果我用struct更改所有class
次出现,它会编译(我猜),引擎就像以前一样工作。
如果我是对的,编译后的代码与之前完全相同,因为只有编译器会检查是否调用了私有/受保护的方法,而不是在运行时检查它。
如果我仍然是正确的,class
只是一个关键词,只是让它可爱的眼睛和乞求“请封装你的数据:你将拯救一只小猫”,而私人/受保护的范围仍然是用户。
我知道我听起来有点蹩脚或无关紧要的反叛(类似“C是KISS老兄,不要去”)
回到问题:在生成机器代码时,标准对struct
和class
之间的这一小差异有何看法?为什么要添加一个关键字,并尝试用所谓的“OO模型”给程序员留下深刻印象,而这完全没有强制执行呢?它受到了java的影响吗?
答案 0 :(得分:5)
该标准完全没有提及生成机器代码。
保留了 struct
,以便更轻松地迁移旧版C代码。通常,C ++程序员将其用于POD类结构。
答案 1 :(得分:4)
实际上,class
和struct
都是在编译时检查的。唯一的区别是,您未明确指定访问权限的成员的默认值是public
(对于struct
)还是private
(对于class
)。否则,它们会产生完全相同的对象。如果明确指定了所有访问控制,则可以使用其中任何一个,它们将是相同的。
答案 2 :(得分:2)
没有其他差异,但默认访问权限。实际上你甚至可以写下这样的东西:
class X;
X* pX;
struct X {};
它必须编译。
答案 3 :(得分:2)
没有。 struct
和class
之间的差异仅限于其成员和继承的默认可访问性。对于public
,struct
和private
class
答案 4 :(得分:2)
struct
和class
之间的差异只是基础和属性的默认访问级别,访问级别仅在编译时验证,因此您可能想要获得一些库编辑标题并随class
更改所有struct
以访问内部详细信息。
<强>不强>
如果更改默认访问说明符,编译器不需要生成完全相同的代码。特别是这两个类可以有或没有相同的内存布局,具体取决于编译器:
struct a {
int a;
private:
int b:
};
class b {
int a;
public:
int b;
};
原因是该标准要求所有成员属性在同一访问限定符中的增加位置内部布局。允许使用编译器(我不知道任何编译器,但由于这不是必需的,它可能会在下一版本中更改),从不同的访问块重新排序字段。编译器可以决定公共属性首先出现,而私有属性出现在对象的末尾,这意味着将交换两个类中的字段a
和b
的位置。
答案 5 :(得分:1)
C ++中结构和类之间的唯一区别是默认情况下类具有私有成员和基类。通常,将class
更改为struct
不应影响生成的计算机代码。
答案 6 :(得分:1)
不,它绝对不受Java的影响。检查时间表。 :)
即使它不能控制默认可见性,这仍然非常有意义。它有点像是有了可用的语义,让你说出你的意思。如果您使用struct
,那么您可能会在较旧的范例内工作,在这种范例中,公共可见性是通常会被考虑的唯一类型,并且如果您正在使用class
,你正在考虑更多的OO术语,其中私人知名度得到更高的尊重 - 我不知道,对我来说是有道理的。
答案 7 :(得分:1)
有些人试图使用'struct'关键字来表示各种事物。例如,有些人尝试使用struct
指定POD-ness或仅使用数据类(仅包含公共成员变量且没有函数的类)。
在我看来,这是一个严重的错误,我听到的所有原因都是有缺陷的。首先,像struct
这样的关键字不足以表达他们试图用它来记录的条件。由于关键字实际上并不意味着特别是人们要么接受这个,要么试图断言他们自己的意思。关于struct
应该在代码中的含义有太多不兼容的意见,以便记录它们中的任何一个。您希望尽可能清楚地记录诸如“此对象必须始终是POD”之类的内容,而不是依赖于难以记住的模糊的团队标准细节。所以,为了记录这样的事情,老实说,唯一足够的是// This object must always be a POD
。它清晰,简单,不会被任何知道POD是什么的人误解,而且这个定义很明确。
我听过使用关键字class
而不是struct
的最佳理由是,您应该更喜欢私有访问公共访问权限,只显示必要的内容。换句话说,“默认”类型的继承和访问暴露应该是私有的,直到显示需要更多访问。我同意这个观点,但我不同意使用struct关键字来遵守这个原则。
无论人们决定什么都是相当随意的。之后的原因可以用于决定,但我发现选择其中一个的人并不容易说服。我从'class'切换到'struct'因为我读了太多关于现代C ++的书和太多的增强代码;你很少会看到'class'关键字。说实话,没关系;遵循您当时所在团队的标准。在我看来,添加一个基本上没有意义的关键字是一个错误。
编辑:虽然,我不得不说我不喜欢使用class
的另一个原因是它意味着太多的东西,即使它也没有特别的意义。例如,您可以在模板参数规范中使用class
代替typename
。即使您使用class
关键字,也可以传递任何类型,而不一定是任何类(如int
)。我唯一希望使用class
关键字的地方是它实际上意味着某些东西以及您真正必须的地方:指定模板模板参数。
答案 8 :(得分:0)
struct关键字是C的遗产。是的,唯一的区别(据我记得)是关于受保护成员的默认行为。
“C ++编程语言”中的Bjarne Stroustrup:
根据定义,struct是一个默认公共成员的类;
struct s {...
只是
的简写class s {public:...
但OO模型不仅仅是封装。它增加了继承和成员函数等功能。
答案 9 :(得分:-1)
struct
因遗留原因而存在,就是这样。当你使用struct
而不是class
时,你不会杀死小猫或任何东西,反之亦然 - 实际上,它们是相同的,关键字和默认值略有不同。