12

簡単な質問があります:

class my
{
};
my ob;

コンパイラを使用すると、意味のあるオブジェクトを作成できます。また、コンストラクターがプライベートなオブジェクトを作成できないことは承知しています。

私には、クラス内のすべてprivateが明らかにデフォルトのコンストラクターではないように見えます(デフォルトのコンストラクターである必要があるため、オブジェクトを作成できるためpublic)。publicしかし、私を混乱させるのは、クラスにセクションがないことです。

publicでは、この場合、デフォルトのコンストラクターを配置するためだけにセクションを作成しますか?

それとも何か他のことが起こっていて、私の理論的根拠は間違っていますか?

また、オブジェクトが作成/アクセスされたときに、パブリック、プライベート、および保護されたアクセスは内部でどのように編成/追跡されますか?

今まで空のクラスのオブジェクトを作成したことがなかったので、この質問を受けました。

4

5 に答える 5

9

コンストラクターを自分で宣言しない場合、C++ コンパイラーは常に公開の簡易コンストラクターを生成します。さらに、パブリック コピー コンストラクターと代入演算子も暗黙的に作成します。

C++11 標準 12.1.5 から:

クラス X に対してユーザーが宣言したコンストラクターがない場合、パラメーターを持たないコンストラクターは暗黙的にデフォルトとして宣言されます。暗黙的に宣言された既定のコンストラクターは、そのクラスのインライン パブリック メンバーです。

および 12.8.7、12.8.11:

クラス定義でコピー コンストラクターが明示的に宣言されていない場合は、暗黙的に宣言されます。[...] 暗黙的に宣言されたコピー [...] コンストラクターは、そのクラスのインライン パブリック メンバーです。

そして最後に 12.8.18、12.8.20、12.8.22:

クラス定義でコピー代入演算子が明示的に宣言されていない場合は、暗黙的に宣言されます。[...] クラス X の定義で移動代入演算子が明示的に宣言されていない場合は、暗黙的に宣言されます [...]。暗黙的に宣言されたコピー/移動代入演算子は、そのクラスのインライン パブリック メンバーです。

移動代入演算子は、この質問の範囲外の特定の状況でのみ生成されることに注意してください。詳細については、12.8.20 を参照してください。

プライベート コンストラクターが必要な場合は、自分で宣言する必要があります。

class my { my() {} };

コピー コンストラクターまたは代入演算子の生成を防ぎたい場合は、宣言することはできますが、実装することはできません。

class my { my(my const &); };

または、C++11 以降、明示的に削除します。

class my { my(my const &) = delete; };
于 2013-08-06T13:13:50.793 に答える