2012-05-30 3 views
2

/* 다음 프로그램은 아무 것도 발견되지 않아도 불가사의하게 재귀를 입력하는 것처럼 보입니다. 컴파일러 : g ++ (우분투 4.4.3-4ubuntu5.1) 4.4.3 컴퓨터 : 86 OS : 우분투 10.04 64 비트기본 생성자 재귀 충돌

*/

#include<iostream> 
    using namespace std; 

    class Test 
    { 
    public: 
     Test():x(9) 
     { 
     cout << " Test::Test\n"; 
     Test (x); 
     } 
     Test (int a) 
     { 
     cout << " Test::para\n"; 
     } 
    private: 
      int x; 
    }; 


int main(void) 
{ 
Test a; 
return 0; 
} 

그 이유는 무엇입니까?

+0

만약 x를 하드 코딩 된 값으로 변경하면 Int, 그 잘 작동합니다. 그렇지 않으면 기본 생성자를 다시 호출합니다 n – PeerPandit

+0

왜 기본 생성자에서 매개 변수화 된 생성자를 호출합니까? x는 이미 거기에있는 멤버 초기화자를 사용하여 초기화되었습니다. BTW에서는'Test (int a = 9)'를 정의하고 기본 생성자를 전혀 생략 할 수 있습니다. –

+1

소리가 컴파일러 버그와 같습니다. –

답변

2

C++에서 다른 생성자를 호출 할 수 없습니다. 그러나 C++ 11로 시작, 당신은 initialiser 목록에 생성자 호출을 전달할 수 있습니다 :

class Test { 
public: 
    Test(): Test(9) { 
     cout << " Test::Test\n"; 
    } 

    Test (int a) : x(a) { 
     cout << " Test::para\n"; 
    } 

private: 
    int x; 
}; 

이유 코드 충돌에 대한 설명은 Wolfgang’s answer를 참조하십시오.

9
Test (x); 

가없는 생성자 호출로 ...

Test x; 

로 분석된다.

Test (y); 

으로 작성하고 동일한 동작을 얻을 수도 있습니다.

+1

예전의 "선언 또는 명령문 표현 일 수 있다면 선언"이 다시 나타납니다! – aschepler

+0

Brilliant! 너무 나쁜 나는 단 하나 upvote을 줄 수 있습니다. –