생성자에서 콜론(:)은 왜 쓰는 건가요?

이런 코드를 봤는데

소스 코드

#include <iostream>

class Foo {
public:
  int bar;
  Foo(int num): bar(num) {};
};

int main(void) {
  std::cout << Foo(42).bar << std::endl;
  return 0;
}

여기서 : bar(num)처럼 쓰는건 뭔가요?

저렇게 쓰는 걸 처음 봤는데 다른 함수를 호출하는 건가요? 아니면 생성자에서 쓴걸 보면 생성자랑 관련 있는 건가요?

1답변

  • 좋아요

    1

    싫어요
    채택취소하기

    Foo(int num): bar(num) 은 초기화 리스트라고 하고, 멤버 변수 barnum으로 초기화하는 역할을 합니다.

    //초기화 리스트
    Foo(int num): bar(num) {};
    
    //함수에서 초기화
    Foo(int num)
    {
       bar = num;
    }
    

    그냥 생성자 함수{} 내에서 초기화하는 것과, 이렇게 초기화 리스트를 쓰 는것의 차이는

    초기화 리스트에서 초기화를 하는 경우, 생성자가 호출될 때 객체의 생성과 초기화가 한 번에 이루어집니다.

    생성자 함수 내{}에서 초기화를 하는 경우, 객체가 생성되어, 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;
    }
    

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

작성한 답변에 다른 개발자들이 댓글을 작성하거나 댓글에 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.