【发布时间】:2012-10-08 04:04:31
【问题描述】:
可能重复:
What are the differences between struct and class in C++
这个问题已经被问过很多次并且得到了很多回答,但我偶尔会遇到一些令人困惑的问题。
总而言之,C++ 结构和类之间的区别在于著名的默认公共访问与私有访问。除此之外,C++ 编译器对待结构的方式与对待类的方式相同。结构可以有构造函数、复制构造函数、虚函数。等等。结构的内存布局与类的内存布局相同。 C++ 有结构的原因是为了向后兼容 C。
现在,由于人们对使用哪个结构或类感到困惑,因此经验法则是,如果您只有普通的旧数据,请使用结构。否则使用一个类。而且我读过结构在序列化方面很好,但不是从哪里来的。
然后前几天看到这篇文章:http://www.codeproject.com/Articles/468882/Introduction-to-a-Cplusplus-low-level-object-model
它说如果我们有(直接引用):
struct SomeStruct
{
int field1;
char field2;
double field3;
bool field4;
};
然后这个:
void SomeFunction()
{
SomeStruct someStructVariable;
// usage of someStructVariable
...
}
还有这个:
void SomeFunction()
{
int field1;
char field2;
double field3;
bool field4;
// usage of 4 variables
...
}
都是一样的。
如果我们有一个结构或者只是在函数内写下变量,它表示生成的机器代码是相同的。当然,这仅适用于您的结构是 POD 的情况。
这就是我感到困惑的地方。在 Effective C++ 中,Scott Meyers 说没有空类。
如果我们有:
class EmptyClass { };
它实际上是由编译器布置的,例如:
class EmptyClass
{
EmptyClass() {}
~EmptyClass() {}
...
};
所以你不会有一个空的类。
现在如果我们把上面的结构改成一个类:
class SomeClass
{
int field1;
char field2
double field3;
bool field4;
};
是不是意味着:
void SomeFunction()
{
someClass someClassVariable;
// usage of someClassVariable
...
}
还有这个:
void SomeFunction()
{
int field1;
char field2
double field3;
bool field4;
// usage of 4 variables
...
}
在机器指令方面是否相同?没有调用 someClass 构造函数?或者分配的内存与实例化类或单独定义变量相同?那么填充呢?结构和类做填充。在这些情况下填充是否相同?
如果有人能对此有所了解,我将不胜感激。
【问题讨论】:
-
技术上
struct具有public和classprivate的默认继承访问权限。 -
如果在阅读该文章时,您认为
struct与class除了默认的成员访问保护级别之外有任何不同,那么您就得到了错误的印象。就这么简单。 -
-1:因为缺乏研究。我只在“”标题框中输入了您问题的标题。我在相关问题列表中得到的第一个问题(当然是在这个问题之后)是一个引导答案的(封闭的)问题。带有相关问题列表的框不仅仅是为了展示。
-
@NicolBolas 谢谢。我做了我的研究。我已经读过这个问题很多次了。然而,我的问题是关于上述文章和我感觉到的可能矛盾。我询问了构造函数、填充和汇编代码。如果您阅读了这个问题,您会发现我已经提到了公共与私人。我的问题是关于编译器生成的代码,这个问题没有讨论。我建议您在将我的标题输入“”之前阅读完整的问题。请阅读此问题中的一些答案,您就会明白。干杯。