2017-01-06 7 views
-1

私は初心者です。学習コンストラクタ。下記の2つのコードを参照し、コード2が機能していない理由を説明してください。ありがとう。以下のコードのC++コンストラクタ定義の相違点

コード1:

#include <iostream> 
using namespace std; 

class Box 
{ 
    int x; 
public: 
    Box::Box(int a=0) 
    { 
     x = a; 
    } 
    void print(); 
}; 

void Box::print() 
{ 
    cout << "x=" << x << endl; 
} 

int main() 
{ 
    Box x(100); 
    x.print(); 
} 

コード2:

#include <iostream> 
using namespace std; 

class Box 
{ 
    int x; 
public: 
    Box(int a=0); 
    void print(); 
}; 

Box::Box(int a=0) 
{ 
    x = a; 
} 

void Box::print() 
{ 
    cout << "x=" << x << endl; 
} 

int main() 
{ 
    Box x(100); 
    x.print(); 
} 

コード1が機能していますが、コード2が動作しないのはなぜ?あなたは、パラメータのデフォルト値を繰り返すように許可されていないいくつかの奇妙な理由から

+6

あなたが「動作しない」で何を意味するかについて詳しく説明してください。 –

+2

'Box :: Box(int a = 0)':定義から宣言を分離するときにデフォルト値を再宣言することはできません。 – AndyG

+0

私は、あなたがBox :: Box(int a = 0)を指定したので、コード2は "動かない"と信じています。 Box :: Box(int a)に置き換えます。 – tysonite

答えて

5

class Box 
{ 
    int x; 
public: 
    Box(int a=0); 
//------------^ given here 
    void print(); 
}; 

Box::Box(int a=0) 
//------------^^ must not be repeated (even if same value) 
{ 
    x = a; 
} 
+1

その理由は奇妙ではありません。 'Box(Foo a = Foo {}){}'と 'Box(Foo a = Foo {})を考えてみましょう。 Box :: Box(Foo a = Foo {}) 'となります。 'Foo {}'は 'a 'を初期化するために使われるべきですか? – Zereges

+0

@Zereges - はい、私はそれがデフォルト値を評価するコンテキストと関係していることを知っています。しかし、ここでは '= 0'は常に同じ結果を与えるので、許可されている可能性があります。しかし、そうではありません。 –

+2

いくつかの値ではうまくいくが、他の値ではうまくいかない場合は、やや奇妙に思えるだろう。とにかく、ヘッダーはデフォルト値を表示したい場所で、余分なものはなぜですか? – Aziuth

関連する問題