2011-01-24 96 views
7

struct默认为公开,class默认为私有。每次我使用struct而不是class时,我会杀死一只小猫吗?

让我们以Ogre3D为例;如果我用struct更改所有class事件,它会编译(我猜),引擎和以前一样工作。

如果我是正确的,编译后的代码是完全和以前一样,因为它,它不是在运行时检查是唯一,它检查是否有私人/受保护的方法被称为编译器。

如果我还是对的,class只是一个关键字,只是让其可爱的眼睛和乞讨“请封装你的数据:你可以节省一只小猫”,而私人/保护的范围仍然上涨给用户。

我知道我听起来有点跛或反叛毫无来由(类似“C是KISS的家伙,不要去”

回到问题:什么是标准说一下structclass,而这之间的差别不大生成机器码?为什么添加关键字和尝试,而这是完全没有,那么执行呢?是不是由Java的影响?

+6

实际上恰恰相反。每当你使用“结构”就足够的'class'关键字时,你就会杀死一只小猫。不,自从C++首次发布以来,并没有受到Java的影响。 – 2011-01-24 17:28:57

+1

C++不是一种严格的OO语言,它是一种多范式语言,不仅支持面向对象的操作,因此它不试图对开发者实施面向对象的概念。如果他们愿意的话,开发者可以使用OO风格。请参阅C++标记的信息条目http://stackoverflow.com/tags/c%2b%2b/info – Glen 2011-01-24 17:28:59

+0

有更多的答案在这个问题在http://stackoverflow.com/questions/4090794/c-when-should -i-use-structs-instead-of-class-and-where-the-the-speed-differe。 – 2011-01-24 17:30:05

回答

2

structclass之间的区别仅仅是基地的默认访问级别和属性,以及访问级别仅在编译时验证,因此你可能会得到一些图书馆编辑页眉和更改所有classstruct访问内部细节。

不要

编译器不需要生成完全相同的代码,如果你更改默认的访问说明符。具体而言,这两个类可能或不具有相同的内存布局,根据不同的编译器:

struct a { 
    int a; 
private: 
    int b: 
}; 
class b { 
    int a; 
public: 
    int b; 
}; 

的原因是,该标准要求所有成员属性在内存中相同的访问预选赛中增加位置进行布局。编译器是允许的(我不知道任何这样做,但由于这不是必需的,它可能会在下一个版本中发生改变),可以对来自不同访问块的字段进行重新排序。编译器可以决定公共属性是第一位的,而私人位于对象的末尾,这意味着两个类中的字段ab的位置将被交换。

2

没有其他方面的差异,但默认访问。打动与所谓的“OO模型”程序员事实上,你甚至可以写例如:

class X; 

X* pX; 

struct X {}; 

它必须编译。

+0

尽管MSVC将会尽力。 – 2011-01-24 17:56:11

1

在C++结构和类之间的唯一区别是,类具有默认私有成员和基类。通常将class更改为struct不应影响生成的机器代码。

+0

“默认的基类”?你什么意思?结构可以有一个基类,类也是这样,但在任何一种情况下都必须明确指定基类。 – 2011-01-24 17:30:29

4

其实,classstruct都在编译期进行检查。唯一的区别是,您没有明确指定访问权限的成员的默认值是public(对于struct)还是private(对于class)。否则,它们会产生完全相同的对象。如果您明确指定了所有的访问控制,则可以使用任意一个,它们将相同。

5

这个标准根本没有说明关于生成机器代码。

struct被保留下来,使迁移旧的C代码更容易。通常情况下,C++程序员将其用于类POD结构。

2

不可以。structclass之间的区别仅限于其成员和继承的默认访问权限。两者都是public,对于structprivate对于class

1

不,它绝对不受Java的影响。检查时间表。 :)

即使它不会做的比控制默认的知名度,免得仍然是相当有意义的。它在某种程度上成为一个可用的语义,可以让你说出你的意思。这个想法,如果你使用struct,那么你可能在一个更老的范例中工作,公众可见性是通常会被想到的唯一类型,如果你使用class,你会考虑更多的OO在私人知名度更高的条款 - 我不知道,对我有意义的家伙。

-1

struct因为遗留原因而存在,就是这样。如果你使用struct而不是class,或者反之亦然,你不会杀死一只小猫或任何东西 - 它们实际上是同样的东西,但关键字和默认值略有不同。

0

嗯,现在......如果说你把这样的程序进入公共空间,这样说OSS,人们会朝你扔石头;)

struct关键字是类C遗产。是的,唯一的区别(据我记忆)是关于成员被保护的默认行为。

Bjarne的Stroustrup的在 “The C++程序设计语言”:

根据定义,一个结构是其中成员默认都是公共的类;这是

的struct {...

仅仅是速记

S级{市民:...

但OO模型是远不止封装。它增加了诸如继承和成员函数之类的东西。

1

有人试图使用'结构'关键字来表示各种事情。例如,有些人尝试使用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的唯一时间是它实际上确实意味着什么,以及您实际上绝对必须:指定模板模板参数。

相关问题