CPP에서 클래스의 멤버변수를 초기화하지 않을 경우 문제가 생길 수 있다.
class Inven
{
public:
int amount;
void ShowAmount()
{
cout << amount << endl;
}
};
int main()
{
Inven P1;
P1.ShowAmount();
}
위와 같이 쓰레기 값이 나온다. 이 주소에 중요한 정보가 들어 있었다면 보안 상 문제가 생겼을 수도 있다.
자식 클래스가 생성자를 호출할 때 별다른 명시가 없으면 부모 클래스의 기본 생성자를 호출한다.
Cclass() : Pclass(3,4) //이런 식으로 부모클래스의 생성자를 지정할 수 있다.
Cclass() : Pclass(3), mem(4)// 멤버 변수를 초기화할 수도 있다.
멤버 변수로 객체가 있을 때 생성자의 { } 안에 객체를 초기화 하면 생성자와 소멸자가 두 개 씩 호출 될 수 있다.
Inven::Inven()
{
mon = Money(20); //Money라는 객체 멤버 초기화
}
이런 현상이 발생하는 이유는 생성자의 선처리 영역에서 해당 멤버의 기본 생성자가 호출되기 때문이다. 해결하기 위해서 아래와 같이 멤버 이니셜라이저로 초기화 한다.
Inven::Inven() : mon(20)
{
}
선언과 동시에 정의를 해야하는 const 멤버 변수나 참조자도 멤버 이니셜라이저를 사용하여 초기화 할 수 있다. { } 안에서 초기화는 불가능하다.
Inven::Inven() : mon(20), amount(1) // 이렇게 하면 빌드가 되지 않는다.
{
refmon = amount;
camount = 199;
}
Inven::Inven() : mon(20), amount(1),refmon(amount),camount(100)
{
//이러면 가능하다~
}