每次我使用struct而不是class时,我会杀死一只小猫吗?

jok*_*oon 7 c++ struct class

struct默认情况下是公共的,默认情况下class是私有的.

让我们以Ogre3D为例; 如果我class用struct 更改所有出现,它会编译(我猜),并且引擎就像以前一样工作.

如果我是对的,编译后的代码与之前完全相同,因为只有编译器会检查是否调用了私有/受保护的方法,而不是在运行时检查它.

如果我仍然是对的,class只是一个关键词,只是让它可爱的眼睛和乞求"请封装你的数据:你将保存一只小猫",而私人/受保护的范围仍然取决于用户.

我知道我听起来有点蹩脚或无关紧要的反叛(类似"C是KISS老兄,不要去")

回到问题:标准对于生成机器代码structclass生成机器代码之间的这种微小差异有何看法?为什么要添加一个关键字,并试图用所谓的"OO模型"给程序员留下深刻印象,而它完全没有强制执行呢?它受到了java的影响吗?

Oli*_*rth 5

该标准根本没有提到生成机器代码.

struct保留了以便更容易迁移旧C代码.通常,C++程序员将其用于类似POD的结构.


Dav*_*eas 2

struct和之间的区别class只是基础和属性的默认访问级别,并且访问级别仅在编译时验证,因此您可能会想要让某些库编辑标头并更改所有内容classstruct获取对内部详细信息的访问权限。

如果更改默认访问说明符,编译器不需要生成完全相同的代码。特别是,这两个类可能具有或不具有相同的内存布局,具体取决于编译器:

struct a {
   int a;
private:
   int b:
};
class b {
   int a;
public:
   int b;
};
Run Code Online (Sandbox Code Playgroud)

原因是该标准要求所有成员属性在内存中以同一访问限定符内递增的位置布置。允许编译器(我不知道有什么编译器这样做,但由于这不是必需的,因此很可能在下一版本中更改)对来自不同访问块的字段进行重新排序。编译器可以决定公共属性位于对象的末尾,而私有属性位于对象的末尾,这意味着两个类中字段a和的位置将被交换。b