명칭과 기능
Foo(int num): bar(num) 은 초기화 리스트라하고, bar 를 num 으로 초기화하는 역할을 한다.
//초기화 리스트 Foo(int num): bar(num) {}; //함수에서 초기화 Foo(int num) { bar = num; } | cs |
그냥 생성자 함수{} 내에서 초기화하는 것과, 이렇게 초기화 리스트를 쓰 는것의 차이는 초기화 리스트에서 초기화를 하는 경우, 생성자가 호출될 때 객체의 생성과 초기화가 한 번에 이루어진다.
생성자 함수 내 { } 에서 초기화를 하는 경우, 객체가 생성되어, default생성자로 초기화된 상태에서 다시 한 번 할당받게 하게 됩니다. 이 경우엔 default할당-유저할당의 2단계를 거치게 돼서 오버헤드가 생긴다.
초기화 리스트를 써야만 하는 상황은 크게 다음과 같다.
- 클래스가 레퍼런스를 멤버로 가질 때
- non static const멤버가 있을 때
- default 생성자가 없을 때
- base class를 초기화할 때
- 생성자 파라미터의 이름이 데이터 멤버랑 같을 때(이 경우는 this를 써서 해결할 수도 있다.
초기화 리스트를 써야만 하는 상황
class MyClass { public: int &i; //레퍼런스 멤버. 초기화 리스트를 써야 함 int b; //Non static const 멤버. 초기화 리스트를 써야 함 const int k; //생성자 파라미터의 이름이 데이터 멤버랑 같음. 초기화 리스트를 쓸수 있음(선택 가능) MyClass(int a, int b, int c):i(a),b(b),k(c) { /* 초기화 리스트를 쓰고 싶지 않은 경우 this->a = a 같이 써야 함 */ } }; class MyClass2:public MyClass { public: int p; int q; //base class인 MyClass가 default생성자가 없기 때문에 무조건 초기화 리스트에서 초기화해줘야 함 MyClass2(int x,int y,int z,int l,int m):MyClass(x,y,z),p(l),q(m) { } }; int main() { int x = 10; int y = 20; int z = 30; MyClass obj(x,y,z); int l = 40; int m = 50; MyClass2 obj2(x,y,z,l,m); return 0; } | cs |
'Language > C++' 카테고리의 다른 글
class 초기화 순서 initialize list, in constructor, member variable (0) | 2019.05.25 |
---|---|
모듈러란? (Mod) (1) | 2019.05.11 |
structure operator (0) | 2019.05.09 |