생성자에서 멤버 오브젝트를 더 효율적으로 만들 수 있는 생성자 멤버 초기화 리스트를 알아보자.
class milk{
milk();
int age;
milk(age);
}
Class cow{
milk son;
cow(int age) {
son = milk(age); // case 1
}
cow(int age):son(milk(age)) {} // case 2
};
일단 생성자가 호출될 때도 함수와 같이 스택 프레임에 생성자 스택이 들어간다.
case 1의 경우 오브젝트가 생성된 후 생성자가 호출될 때 세 가지 이벤트가 일어난다.
1. son 멤버가 기본 생성자 milk()로 초기화된다. // son에 대입연산이 일어나기 전에 메모리에 존재해야하니
2. 임시 객체 milk(age)가 스택에 추가로 할당된다.
그 후 son에 임시 객체 milk가 대입되고(대입 연산자 호출) 임시 객체는 삭제된다.
이렇게 생성자 하나를 호출했지만 많은 연산이 발생했다.
반면 case 2의 Member init list로 생성자를 만들 경우 임시 객체는 처음부터 만들어지지 않고
cow 오브젝트가 생성될 때 멤버 son이 age값으로 동시에 초기화가 진행되기에
스택에 불필요한 임시 객체가 할당되고 삭제되는 case 1의 상황을 막을 수 있다.