2016-05-21 9 views
1

次のコンストラクタは、C++のために同じであれば、私は思ったんだけど:中括弧は空のコンストラクタに関係しますか?

class foo 
{ 
public: 
    foo(void){}; 
... 
} 

class foo 
{ 
public: 
    foo(void); 
... 
} 

中括弧は、これらの2つの場合には関係ありますか?どうもありがとう!

答えて

6

彼らは同じではありません。 {}は通常の関数本体を表し、前者はfunction definitionとする。

foo(void){}; // function definition 
foo(void); // function declaration 
+0

リンクありがとうございます! – zack

2

はい。それがなければ宣言だけです。両方とも宣言と定義です。それを使用してみてください - 定義なしでリンカエラーが発生します

6

はいそうです。もう1つはundefined reference to foo::fooを生成します(別の場所で定義されていない場合)。あなたがC++ 11以上を使用することができる場合、あなたは

foo()=default; 

を使用することができますコンパイラが生成コンストラクタ

+0

'= default'提案に感謝します! – zack

+1

'foo()= default;'は 'foo(){}'とまったく同じではないことに注意してください。最初のものは "些細な"コンストラクタであり、2番目のものはそうではありません。ユーザーが定義したコンストラクタは、たとえ空であっても簡単なことではありません。 –

3

を定義するためにこれらのブラケットは、空、インラインコンストラクタを宣言します。その場合、コンストラクタは存在しますが、コンストラクタがまだ暗黙のうちに行うこと以外は何もしません。

2番目のケースでは、コンパイラはそれらがなくても、.cppファイルなどの別の場所で実装を期待しています。

関連する問題