2011-07-21 9 views
15

以下のコードでは、コンパイラがmClass2に対してなぜ不平を言っていないのですか?C++ - コンストラクタがプライベートである場合、これは何をしていますか?

class CMyClass{ 
private: 
    CMyClass(){} 
}; 

void TestMethod(){ 
    CMyClass mClass1; //Fails. 
    CMyClass mClass2(); //Works. 
} 
+0

http://stackoverflow.com/questions/4296090/some-problems-while-learning-stl/4296118#4296118としても知られて –

+1

:ほとんどの難問の解析(HTTPを参照してください:// EN。 wikipedia.org/wiki/Most_vexing_parse) –

答えて

16

あなただけCMyClassを返すゼロ引数の機能mClass2を宣言したので。これは有効なオプションです。たとえば、この関数がアクセスできるインスタンスはstatic CMyClassとなる可能性があります。 CMyClassにはまだパブリックコピーコンストラクタがあることに注意してください。

(アセンブラとラインCMyClass mClass2();をコメントアウトすると、同じ出力を生成することを観察するために、このモジュールをコンパイルし、自分を納得させるために。)

+1

また、有効な移動コンストラクタです。 – Arafangion

+0

ありがとうございました。 :) – R4D4

10

それは関数を宣言し、あなたが考えるとしてコンストラクタを呼び出すされていないため。

これは、C++でMost Vexing Parseと呼ばれます。

CMyClass mClass2(); 

には、パラメータを取らず、CMyClass

+0

**私はこれまでにそれについて聞いたことがあるとは言えませんが、私はそれを見ていきます、ありがとうございます。 :) – R4D4

+0

@ R4D4:あなたを見上げるためのリンクを追加しました:) –

1

第一方は、関数宣言で返す関数mClass2()を宣言する。

関連する問題