这是一个重复的问题《C++中struct和class的区别在哪里?》,但有时我会遇到一些令人困惑的事情。
总的来说,C++结构体和类的区别在于默认的 public vs. private 访问。除此之外,C++ 编译器对待结构体的方式与它对待类的方式相同。结构体可以拥有构造函数、拷贝构造函数、虚函数等等。并且结构体的内存布局与类的内存布局相同。C++ 之所以有结构体是为了向后兼容 C。
现在,因为人们不确定使用 struct 还是 class,经验法则是如果你只有普通的数据,请使用 struct。否则使用 class。我读到过结构体在序列化方面很好,但不知道这是从哪里得出的。
然后是这个:
实际上,它是由编译器布局的,例如:
这些在机器指令方面是相同的吗?没有调用someClass构造函数吗?还是分配的内存与实例化类或单独定义变量相同?那填充呢?结构体和类会填充。在这些情况下,填充是否相同?我真的很感激如果有人能为此提供一些见解。
总的来说,C++结构体和类的区别在于默认的 public vs. private 访问。除此之外,C++ 编译器对待结构体的方式与它对待类的方式相同。结构体可以拥有构造函数、拷贝构造函数、虚函数等等。并且结构体的内存布局与类的内存布局相同。C++ 之所以有结构体是为了向后兼容 C。
现在,因为人们不确定使用 struct 还是 class,经验法则是如果你只有普通的数据,请使用 struct。否则使用 class。我读到过结构体在序列化方面很好,但不知道这是从哪里得出的。
我最近看到了这篇文章: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
,而class
则为private
。 - chrisstruct
与class
在除默认成员访问保护级别外有任何不同,那么你的印象是错误的。就这么简单。 - Seth Carnegie