私はPODの意味を理解しました。そして、C++で構造を宣言すると次のようになります。
struct f {};
デフォルトのコンストラクター、デフォルトのコピーコンストラクター、デフォルトのデストラクタなどがあります(これを正しく取得した場合)
私の質問は、暗黙のコンストラクタ/デストラクタなどを邪魔することなく、プレーンデータ(4つのint値など)だけでPOD構造を宣言するにはどうすればよいですか?
私は何か見落としてますか?
すべてのオブジェクトタイプには、コンストラクタ(それ以外の場合はどのように構築しますか?)とデストラクタ(それ以外の場合はどのように破棄しますか?)があります。あなたが言ったかのように、PODのみのフィールドの場合、デフォルトの実装は操作なしであるため、それらは何も「邪魔」しません。
struct f {
f() {}
~f() {}
int a, b, c, d;
};
ただし、空のコンストラクターを作成すると、型は非PODになります。C ++ 11は、デフォルトでこれを解決します。
f() = default;
~f() = default;
コピーコンストラクターの場合は状況が少し異なります。暗黙的に生成されたコンストラクターは、PODタイプに対して「正しいこと」を行うための便利な機能です。
f(const f& other) : a(other.a), b(other.b), c(other.c), d(other.d) {}
これを自分で書き直す理由はありません。型をコピー不可にする場合は、コピーコンストラクターをで削除済みとしてマークするf(const f&) = delete;
か、宣言することができprivate
ます。
メンバー関数は、メンバー変数のようにオブジェクトに格納されないことに注意することも重要です。class
またはstruct
を同時に2つのことと考えることができます。
データレイアウトの説明
そのデータを操作するための関数と型を含む名前空間
オブジェクト指向プログラミングのC++モデルは、これら2つのことを1つの場所に単純に結合します。
暗黙のコンストラクタ/デストラクタなどを邪魔することなく、プレーンデータ(4つのint値など)だけでPOD構造を宣言するにはどうすればよいですか?
このような:
struct f {
int i1, i2, i3, i4;
};
コンパイラーによって生成されたコンストラクターは、PODであることに邪魔されません。
10)POD構造体109は、トリビアルクラスと標準レイアウトクラスの両方である非ユニオンクラスであり、タイプ非POD構造体、非PODユニオン(またはそのようなタイプの配列)の非静的データメンバーを持ちません。 )。同様に、PODユニオンは、トリビアルクラスと標準レイアウトクラスの両方であるユニオンであり、タイプ非POD構造体、非PODユニオン(またはそのようなタイプの配列)の非静的データメンバーはありません。PODクラスは、POD構造体またはPODユニオンのいずれかであるクラスです。
だから、それはする必要があります
a)些細なクラスと
b)標準レイアウトクラス。
以下に説明します。
7)標準レイアウトクラスは、次のようなクラスです
。—非標準レイアウトクラス(またはそのようなタイプの配列)または参照タイプの非静的データメンバーが
ない—仮想関数(10.3)および仮想ベースがないクラス(10.1)、
—すべての非静的データメンバーに対して同じアクセス制御(条項11)があります、
—非標準レイアウトの基本クラス
がありません、—最も派生したクラスおよびで非静的データメンバーがありません非静的データメンバーを持つほとんどの1つの基本クラス
、または非静的データメンバーを
持つ基本クラスがありません。—最初の非静的データメンバーと同じタイプの基本クラスがありません。
と
6)[...]些細なクラスは、些細なデフォルトコンストラクター(12.1)を持ち、簡単にコピーできるクラスです。
詳細:
5)[...]デフォルトのコンストラクターは、ユーザーが提供しない場合、および次の場合は簡単です。—
そのクラスに仮想関数(10.3)および仮想基本クラス(10.1)がなく、
—の非静的データメンバーがないそのクラスには中括弧または等しいイニシャライザーがあり、
そのクラスのすべての直接基本クラスには簡単なデフォルトコンストラクター
があり、クラスタイプ(またはその配列)のクラスのすべての非静的データメンバーに対して、そのような各クラスには、些細なデフォルトコンストラクタがあります。
上記のすべての条件が適用されるため、クラスはPODです。
まず、これらの暗黙的なメンバー関数はすべて概念的にのみ存在します。実際に使用するまでは、何にも影響を与えないでください。これは、あなたがそれらを望まないのであれば、それらが「邪魔になる」べきではないことを意味します。
次に、非仮想メンバー関数は(明示的に宣言されているかどうかに関係なく)、クラスのデータレイアウトに影響を与えません。つまり、彼らはその点で「邪魔をしている」わけではありません(それがあなたの意図したことである場合)。
はい、PODの定義は、暗黙的に生成された特別なメンバー関数を明示的に除外します。デフォルトで生成されたものとまったく同じように機能するものの1つを指定すると、さらに注意が必要になります。タイプはPODではなくなります。C ++ 11では、この問題はdefault
キーワードで解決されます。
これらすべてで、PODの定義は(通常)Cコードの場合とまったく同じです。
struct X { int a, b, c, d; };