2012-10-10 10 views
5

私は、このコンストラクタを見た:"クラス"はコンストラクタで何を意味しますか?

MyClass(class MyOtherClass* = 0) {} 

classキーワードは何を意味するのでしょうか?コンストラクタはポインタMyOtherClassを受け取り、引数をヌルポインタにデフォルト設定しますか?

+0

うわー!面白い、そのような構文を見たことがありません+1 –

+1

@KirilKirov:しかし、あなたは 'struct tm *'を見ましたか? –

+0

@MatthieuM。 - 絶対に。私はこのコメントを書いている間、正確に同じ考えをしていた:) –

答えて

10

これは前方宣言です。 MyOtherClassは、このコンテキストで使用する前に定義する必要はないため、前方宣言で十分です。 =0が引数のデフォルト値です。あなたは完全な定義を必要としない例

Braindumpの:

  • メンバーポインタ
  • メンバーの参照
  • メソッドのパラメータ型
  • メソッドの戻り値の型

を比較以下:

//MyClass.h 
class MyClass 
{ 
    MyClass(MyOtherClass* = 0) {} //doesn't compile 
            //doesn't know what MyOtherClass is 
}; 

//MyClass.h 
class MyClass 
{ 
    MyClass(class MyOtherClass* = 0) {} //compiles, MyOtherClass is declared 
}; 

//MyClass.h 
class MyOtherClass; //declare MyOtherClass 
class MyClass 
{ 
    MyClass(MyOtherClass* = 0) {} //compiles, declaration available 
}; 
+1

ちょうど明確なポイント。 'MyOtherClass'は完全に定義する必要はありません。なぜなら、必要なのはそれへのポインタだからです。 forward-declareは、ポインタを生成するために 'MyOtherClass'について知っておく必要があるすべてのことをコンパイラに伝えます。 –

+0

@JohnDiblingはポインタに限定されません。この場合、それはパラメータなので動作します。オブジェクトメンバの完全な定義は、私が知る限りでのみ必要です(ポインタメンバ、参照、パラメータおよび戻り値の型は完全定義を必要としません)。 –

+0

なぜ 'MyOtherClass'を宣言しているヘッダファイルをインクルードすればいいのですか? – Andreas

関連する問題