[C언어/C++] 생성자 초기화 – :(콜론) 뒤에서 초기화, {} 내에서 초기화 차이

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

대충 예시로 표현하자면 위와 같다.

관련글

제목 작성자 작성일