멤버 이니셜라이저(초기화리스트)

Oak_Cassia·2021년 11월 12일
0

초기화의 중요성

CPP에서 클래스의 멤버변수를 초기화하지 않을 경우 문제가 생길 수 있다.

class Inven
{
public:
	int amount;

	void ShowAmount()
	{
		cout << amount << endl;
	}

	
};

int main()
{
	Inven P1;
	P1.ShowAmount();
}

위와 같이 쓰레기 값이 나온다. 이 주소에 중요한 정보가 들어 있었다면 보안 상 문제가 생겼을 수도 있다.


멤버 이니셜라이저(초기화 리스트)


1. 부모 클래스 생성자 호출

자식 클래스가 생성자를 호출할 때 별다른 명시가 없으면 부모 클래스의 기본 생성자를 호출한다.

Cclass() : Pclass(3,4) //이런 식으로 부모클래스의 생성자를 지정할 수 있다.

2. 멤버 변수 초기화

Cclass() : Pclass(3), mem(4)// 멤버 변수를 초기화할 수도 있다.

3. 객체 멤버 변수 생성자 호출

멤버 변수로 객체가 있을 때 생성자의 { } 안에 객체를 초기화 하면 생성자와 소멸자가 두 개 씩 호출 될 수 있다.


Inven::Inven()
{
	mon = Money(20); //Money라는 객체 멤버 초기화
}


이런 현상이 발생하는 이유는 생성자의 선처리 영역에서 해당 멤버의 기본 생성자가 호출되기 때문이다. 해결하기 위해서 아래와 같이 멤버 이니셜라이저로 초기화 한다.


Inven::Inven() : mon(20)
{

}

4. 참조자와 const 멤버 변수 초기화

선언과 동시에 정의를 해야하는 const 멤버 변수나 참조자도 멤버 이니셜라이저를 사용하여 초기화 할 수 있다. { } 안에서 초기화는 불가능하다.

Inven::Inven() : mon(20), amount(1) // 이렇게 하면 빌드가 되지 않는다.
{
	refmon = amount;
	camount = 199;

}
Inven::Inven() : mon(20), amount(1),refmon(amount),camount(100)
{
	//이러면 가능하다~
}
profile
rust로 뭐할까

0개의 댓글