강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

it09kim님의 프로필 이미지
it09kim

작성한 질문수

홍정모의 따라하며 배우는 C++

8.4 생성자 멤버 초기화 목록

생성자 관련 질문입니다

해결된 질문

작성

·

166

2

안녕하세요

class Something 내에서는

class Something

{

private:

int m_i;

double m_d ;

char m_c;

int m_arr[5] ;

B m_b;   <-- 여기 부분이 선언 가능한데

};

main 함수내에서는 B b; 해보면 안되는데

class B

{

private:

int m_b;

public:

B(const int &m_b_in)

:m_b(m_b_in)

{

}

};

이렇게 class B 에서 생성자를 B(const int &m_b_in) 으로 하고있어서 메인에서 그냥 B b; 선언이 안되는건 알겠는데

Something 함수 내에서는 왜 되는지 궁금합니다

답변 1

7

안녕하세요 😀

클래스의 멤버 변수를 선언하는 필드에서 B m_b; 는 m_b 라는 객체를 생성하는 과정이 아니라 B 라는 설계도(클래스에)의 멤버 변수로서 B 타입의 객체를 참조할 수 있는 "변수"인 m_b 를 선언한 것입니다. 다른 int m_i 이런 것들과 마찬가지로요!

생성자도 함수의 일종이라는 것을 생각해보면, class 멤버 변수 선언(캡처 사진)에서 생성자, 즉 함수를 호출하는게 뭔가 이상하게 느껴지지 않으신가요..?! 클래스는 아직 메모리에 실존하지 않는 추상적인 설계도 역할을 합니다. 저런 멤버 변수 필드는 이 설계도는 이런 멤버 변수들을 가진다라는 것을 추상적으로 정해놓은 것 뿐이기 때문에 이 상태에선 어떤 객체로서 실존하는 상태가 아닌거라 B 라는 자료형 타입의 "변수"로서 일단 정의를 해둔거에요.

B타입 자료형인 m_b 라는 "변수" 가 어떤 B타입 "객체"를 참조하게 될지는 강의 코드에 따르면 Something 의 생성자에서 결정되는 것을 확인할 수 있습니다. 생성자는 클래스라는 설계도에서 메모리에 실존하는 객체로 찍어내는 과정에서 호출되는 함수죠! 이 과정에서 m_b 가 참조할 객체가 생성됩니다. 

Something 의 생성자에서 m_b(mi - 1) 를 통해 B의 매개변수 1개짜리 생성자를 호출하여 B 타입 객체를 만들어 이를 m_b 변수에 할당하는 과정입니다. 

그러니 멤버 변수 필드에서의 B m_b 는 main 함수에서 B b; 가 안되는 것과 전혀 상관이 없습니다. 후자는 "객체를 생성하는 과정"인데 B에는 매개변수 1개짜리 생성자가 이미 정의가 되어 있으므로 디폴트 생성자를 호출할 수 없는 상황이라 안되는 것이구요, 전자는 그저 B 타입의 객체를 참조할 수 있는 m_b 가 Something 의 멤버 변수다~ 라고 추상적으로 정해놓은 상태일 뿐인 것입니다. 그러니 어떤 함수를 호출한다거나 객체를 생성한다거나 그러는 필드가 아니라는것이죠

it09kim님의 프로필 이미지
it09kim
질문자

자세한 설명 감사드립니다!

완전히 이해되었습니다 !!

it09kim님의 프로필 이미지
it09kim

작성한 질문수

질문하기