• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

생성자의 형태에 따른 출력값의 차이

21.11.25 10:06 작성 조회수 153

0

그 생성자 표현방식은 2가지가 있잖아요

 

using namespace std;

class Test

{

int m_value;

int m_ref;

public:

Test(const int& value)

{

Test(10, value);

}

 

Test(const int& ref,const int& value)

{

m_ref = ref;

m_value = value;

}

 

const Test& print()

{

cout << m_value << " " << m_ref << endl;

cout << (int) & m_value << endl;

return *this;

}

};

 

int main()

{

Test(10).print();

}

이 전체코드에서

위의

Test(const int& value)

{

Test(10, value);

}

이 부분은 

Test(const int& value):

Test(10, value)

{}

이거랑 같잖아요

근데 아래코드는 정상작동하는 반면에 위의 코드는

이상한 출력값이 나옵니다. 왜이런걸까요?

답변 1

답변을 작성해보세요.

4

안소님의 프로필

안소

2021.11.25

Test(const int& value)

 

{

 

Test(10, value);

 

}

이건 위임생성자를 호출한 것이 아닙니다. 익명 객체를 생성하는 것입니다. (main 에 있는 친구처럼요)

Test(const int& value):

Test(10, value)

{}

이거랑 다른 것입니다.

전자는 { } 중괄호 내에서 생성자가 호출되었으며 (함수 내에서 처리하는 것과 같음) "익명객체"를 생성하는 과정인 것입니다. 익명 객체이기 때문에 main 에서 호출한 객체와는 무관한, 전혀 다른 "타인 객체"구요. 그래서 main 에서의 객체는 m_value, m_ref 가 초기화되지 않았습니다. 초기화가 된건 main 객체 생성자 내에서 잠깐 살았다가 없어지는 익명객체의 멤버들이구요. 

후자는 "본인"의 위임 생성자가 호출된 것이기에 멤버들이 잘 초기화된거구요. 생성자 초기화 목록의 특별한 문법같은 경우라고 생각하시면 될 것 같습니다.