重複の可能性:
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 の場合にのみ適用されます。
これは私が混乱するところです。効果的な 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 コンストラクターへの呼び出しがないことは? または、割り当てられたメモリは、クラスをインスタンス化するか、変数を個別に定義するのと同じですか? そして、パディングはどうですか?構造体とクラスはパディングを行います。これらの場合、パディングは同じでしょうか?
誰かがこれに光を当てることができれば、本当に感謝しています。