以下のコードでは、コンパイラがmClass2に対してなぜ不平を言っていないのですか?C++ - コンストラクタがプライベートである場合、これは何をしていますか?
class CMyClass{
private:
CMyClass(){}
};
void TestMethod(){
CMyClass mClass1; //Fails.
CMyClass mClass2(); //Works.
}
以下のコードでは、コンパイラがmClass2に対してなぜ不平を言っていないのですか?C++ - コンストラクタがプライベートである場合、これは何をしていますか?
class CMyClass{
private:
CMyClass(){}
};
void TestMethod(){
CMyClass mClass1; //Fails.
CMyClass mClass2(); //Works.
}
あなただけCMyClass
を返すゼロ引数の機能mClass2
を宣言したので。これは有効なオプションです。たとえば、この関数がアクセスできるインスタンスはstatic CMyClass
となる可能性があります。 CMyClass
にはまだパブリックコピーコンストラクタがあることに注意してください。
(アセンブラとラインCMyClass mClass2();
をコメントアウトすると、同じ出力を生成することを観察するために、このモジュールをコンパイルし、自分を納得させるために。)
また、有効な移動コンストラクタです。 – Arafangion
ありがとうございました。 :) – R4D4
それは関数を宣言し、あなたが考えるとしてコンストラクタを呼び出すされていないため。
これは、C++でMost Vexing Parseと呼ばれます。
CMyClass mClass2();
には、パラメータを取らず、CMyClass
**私はこれまでにそれについて聞いたことがあるとは言えませんが、私はそれを見ていきます、ありがとうございます。 :) – R4D4
@ R4D4:あなたを見上げるためのリンクを追加しました:) –
第一方は、関数宣言で返す関数mClass2()
を宣言する。
C++ 0x/C++ 11の統一構文初期化に移動する人は、この問題を取り除く代わりに{}角かっこを使用する必要があります。
クラスC {};関連
http://stackoverflow.com/questions/4296090/some-problems-while-learning-stl/4296118#4296118としても知られて –
:ほとんどの難問の解析(HTTPを参照してください:// EN。 wikipedia.org/wiki/Most_vexing_parse) –