C++을 공부를 하다보면 예제에서
1 2 3 | // 초기화 리스트 Example(int num): test(num) {}; | cs |
어떤건 이런식으로 :(콜론) 뒤에 쓰는 방식으로 초기화를 하고
1 2 3 4 5 6 7 | // 함수에서 초기화 Example(int num) { test = num; }; | cs |
어떤건 이런식으로 {} 함수 내에서 초기화를 하는 모습을 볼 수 있다.
콜론뒤에 쓰는 방식을 두고 초기화 리스트라고 하는데 위 두 방식의 차이점은 초기화 리스트에서 초기화를 하는 경우는 생성자가 호출될 때 객체의 생성과 해당 값으로의 초기화가 한번에 이뤄지는 반면 함수 내에서 초기화를 하는 경우는 객체가 생성되고 default 생성자로 초기화가 된 상태에서 다시 한번 값을 할당 받게 된다는 점이 있다.
초기화 리스트를 써야만 하는 상황으로는
- 클래스가 참조자를 멤버로 가질 때
- non static const 멤버가 있을 때
- default 생성자가 없을 때
- base class를 초기화 할 때
- 생성자 파라미터의 이름이 데이터 멤버랑 같을 때 (이 경우는 this를 써서 해결할 수 있음)
위와 같은 경우가 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | class Example { public: int &a; // 참조자 멤버로 초기화 리스트를 써야함 int b; const int c; // non static const 멤버로 초기화 리스트를 써야함 Example(int h, int b, int i):a(h), b(b), c(i) { // (b) >> 생성자 파라미터의 이름이 데이터 멤버랑 같은 경우로 초기화 리스트를 쓸 수 있음 /* 초기화 리스트를 쓰고 싶지 않은 경우는 this->b=b; 식으로 작성 */ } }; class Example2:public Example { public: int x; int y; // base class인 Example에서 m과 n의 default 생성자가 없기 때문에 무조건 초기화 리스트에서 Example2(int j, int k, int l, int m, int n):myclass(x, y, z), x(m), y(n) {} }; | cs |
대충 예시로 표현하자면 위와 같다.