Constructor를 해주는 이유는 메모리가 할당될 때 initializer를 해주기 위한 것입니다.
class Mother
{
public:
int m_i;
};
class Child : public Mother
{
public:
Child()
{
this -> m_i = 10;
}
};
이렇게 상속을 받은 것을 this -> 로도 가능합니다. 상속을 받으면 자기 거가 되는 것입니다. 하지만 초기화는 불가능한데요.
class Child : public Mother
{
public:
Child()
: m_i(1024)
{
this -> m_i = 10;
this -> Mother::m_i = 1024;
}
};
여기서 초기화를 하면 오류가 발생합니다. 왜 초기화는 안되냐고 생각을 할 수 있습니다.
#include <iostream>
using namespace std;
class Mother
{
public:
int m_i;
Mother()
: m_i(1)
{
cout << "Mother construction " << endl;
}
};
class Child : public Mother
{
public:
double m_d;
public:
Child()
: m_d(1.0)
{
cout << "Child construction " << endl;
}
};
int main()
{
Child c1;
return 0;
}
이렇게 했을 때 mother construction 다음 child construction이 일어납니다. Child c1으로 해줬는데 왜 이렇게 일어나는 것일까요?
내부적으로 child는 mother가 가지고 있는 것을 다 사용할 수 있기 때문에 mother을 다 초기화 한 다음에 child를 초기화합니다. 즉 mother가 상위 순서이기 때문에 당연히 mother 부터 초기화를 해주는 것입니다.
그렇기 때문에 mother 가 초기화 되기 전에 m_i(1)를 child에 초기화를 할 수 없는 것입니다. initialization을 list에서 할 수는 없지만 mother() 에서 초기화가 끝난 다음에
class Child : public Mother
{
public:
double m_d;
public:
Child()
: m_d(1.0)
{
m_i = 1024;
cout << "Child construction " << endl;
}
};
이런식에 코드 안에 mother class의 m_i를 넣어줄 수 있습니다. (물론 m_i 는 public과 protected 일 때 가능합니다) 그럼 m_i를 초기화를 할 때 다른 값으로 하고 싶거나 강제로 mother의 construction을 할 수 있냐고 생각할 수 있습니다.
class Child : public Mother
{
public:
double m_d;
public:
Child()
: Mother(), m_d(1.0)
{
cout << "Child construction " << endl;
}
};
코드에는 항상 Mother() 이것을 생성해주지 않아도 존재합니다. 우리가 눈에 보이지 않을 뿐 compiler는 항상 이런 식으로 컴파일러를 하고 있는 것입니다. 따라서 child를 생성할 때는 항상 mother가 먼저 나오게 됩니다.
이 순서가 바껴서 m_d(1.0), Mother() 이어도 Mother() 을 먼저 실행합니다.
헷갈리신다면 직접 debug를 하셔서 찾아보시면 됩니다.
class A
{
public:
A()
{
cout << "A constructor" << endl;
}
};
class B : public A
{
public:
B()
{
cout << "B constructor" << endl;
}
};
class C : public B
{
public:
C()
{
cout << "C constructor" << endl;
}
};
int main()
{
C c;
return 0;
}
이렇게 나오게 됩니다.
Destructor 같은 경우 반대로 가게 됩니다.
'IT 프로그래밍 > C++' 카테고리의 다른 글
[c++] 상속받은 함수를 오버라이딩 하기 (0) | 2024.05.27 |
---|---|
[c++] 따배시 상속과 접근 지정자 (0) | 2024.05.27 |
[c++] 2702번 초6 수학 (0) | 2024.05.25 |
[c++] 2903번 중앙 이동 알고리즘 (0) | 2024.05.25 |
동적 메모리와 스마트 포인터 (0) | 2024.05.20 |