2017-01-06 6 views
-1

저는 C + +의 초보자입니다. 학습 생성자. 아래에 언급 된 두 가지 코드를 참조하고 코드 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 {})를 생각해보십시오. 상자 :: 상자 (Foo a = Foo {})'. 'Foo {}'를 사용하여'a '를 초기화해야합니까? – Zereges

+0

@Zereges - 예, 기본값을 평가하는 컨텍스트와 관련이 있습니다. 그러나 여기서'= 0'은 항상 같은 결과를 주므로 허용 될 수 있습니다. 그러나 그렇지 않습니다. –

+2

일부 값에 대해서는 작동하지만 다른 값에 대해서는 작동하지 않는 것이 다소 이상합니다. 어쨌든 헤더는 기본값을 보여주고 자하는 곳입니다. – Aziuth