프로그래밍/cpp

[C++]멤버이니셜라이져(멤버초기화리스트)

콘파냐 2015. 4. 28. 19:51
반응형

멤버 초기화 리스트(Mmber Initialization List)라고한다.

생성자의 역할인 멤버변수의 초기화를 대신할 수 있다.

보통 멤버 이니셜라이져라고 부르는데 꼭 사용해야 하는 경우는 4가지가 있다.


1. 상수 멤버의 초기화 (C++11의 경우는 상수멤버변수 선언과 동시에 그냥 초기할 수 있음.)

2. 레퍼런스 멤버 초기화

3. 객체멤버의 초기화

4. 부모클래스의 멤버변수초기화

1, 2, 3번은 비슷한 맥락에서 이해될 수 있다. 4번의 경우는 상속과 객체생성 메커니즘에 대해 잘 이해해야 이해할 수 있다.


2015/04/29 - [프로그래밍/c++] - 부모클래스의 멤버변수 초기화


멤버이니셜라이져 문법

아래는 일반적인 멤버 초기화 방법이다.



 아래는 멤버 이니셜라이저 문법을 사용하였다.


두 경우 결과는 같다.

이 경우 굳이 {}를 비워두고 멤버 이니셜라이져 문법을 사용하지 않아도 된다. 이 문법을 꼭 사용해야 하는 이유는 따로 있다.

멤버 이니셜라이져를 통한 초기화는 객체의 생성 이전에 이루어진다. 이 점을 이해하면 처음에 말한 1, 2, 3번 경우 왜 이 문법을 사용 해야 하는지 감이 올 것이다.


생성자 선언 다음에

:을 쓴 후 멤버 초기화 리스트를 적는다.


x(_x) 는 x에 _x를 대입하라는 뜻이다.


다음 특성은 해답에 대한 단서가 된다.

1. 상수는 선언과 동시에 초기화 되어야 한다.C++11이전 문법은 멤버변수의 초기화가 불가능했다. 클래스 정의는 실제 메모리에 인스턴스를 생성하는 작업이 아니기 때문이다. 단 static으로 선언한 멤버변수는 초기화가 가능하다.


2. 레퍼런스 변수 또한 생성과 동시에 초기화 되어야 한다. 1번과 마찬가지로 객체 생성 시점에 초기화가 되어야 한다.


3. 클래스가 객체 포인터가 아닌 객체멤버변수를 가지고 있다면, 클래스의 객체가 생성된 후엔 객체멤버에 대한 생성자를 호출할 수 없게 된다.


3가지 겨우 객체 생성 시점에 초기화를 해야 하지만 클래스의 객체가 생성된 후에는 이미 멤버변수들이 선언된 상태기 때문에 초기화가 안되게 된다.

객체 생성 전과 후에 모두 초기화가 안되므로 멤버 초기화 리스트라는 특수한 방법을 이용한다.

객체가 생성되기 직전 멤버변수를 선언과 동시에 초기화 한 후 객체를 생성하면 문제가 없을 것이다.

상수 변수, 레퍼런스 변수, 객체 변수 전부 생성과 동시에 초기화를 위해 멤버 초기화 리스트를 사용한다. 


소스코드를 보며 이해해보자.

1. 상수 멤버의 초기화

-std=c++11 컴파일옵션으로 해결할수있다.-std=c++11 컴파일옵션으로 해결할수있다.




2. 레퍼런스 초기화


3.멤버객체변수의 초기화

4번의 경우는 해야 할 이야기가 많으므로 따로 포스팅을 하겠습니다.


상속과 관련한 내용에 대한 이해가 필요합니다.

반응형