C++/Class 2021. 3. 12. 17:56

위임 생성자 (Delegating Constructor)

  • C++11

  • 생성자에서 직접 생성하지 않고, 이미 구현된 생성자를 호출해서 대신 생성하도록 하는 것이다.


기본 예제

  • 다음 예제에서는 st2를 생성할 때 id_, name_ 멤버 변수를 초기화 리스트로 초기화하고있다.

    #include <iostream>
    
    using namespace std;
    
    class Student
    {
      int        id_;
      string    name_;
    
    public:
      Student(const string& name_in)
        : id_{0}, name_{name_in}
      {
        print();
      }
    
      Student(const int& id_in, const string& name_in)
        : id_{id_in}, name_{name_in}
      {
        print();
      }
    
      void    print()
      {
        cout << id_ << ' ' << name_ << '\n';
      }
    };
    
    int        main()
    {
      Student st1(0, "jack jack");
      Student st2("Dash");
    }
  • 같은 기능을 하는 코드가 여러 군데에 있으면 좋지 않으므로 다음과 같이 변경하는게 좋다.

    #include <iostream>
    
    using namespace std;
    
    class Student
    {
      int        id_;
      string    name_;
    
    public:
      Student(const string& name_in)
        : Student(0, name_in)
      {}
    
      Student(const int& id_in, const string& name_in)
        : id_{id_in}, name_{name_in}
      {
        print();
      }
    
      void    print()
      {
        cout << id_ << ' ' << name_ << '\n';
      }
    };
    
    int        main()
    {
      Student st1(0, "jack jack");
      Student st2("Dash");
    }
  • C++11 이전에서는 다음과 같이 초기화 함수로 작성하는게 일반적이었다고 하는데, 나는 이 방법이 더 좋은 것 같다.

    #include <iostream>
    
    using namespace std;
    
    class Student
    {
      int        id_;
      string    name_;
    
    public:
      Student(const string& name_in)
      {
        init(0, name_in);
      }
    
      Student(const int& id_in, const string& name_in)
      {
        init(id_in, name_in);
      }
    
      void    init(const int& id_in, const string& name_in)
      {
        id_ = id_in;
        name_ = name_in;
        print();
      }
    
      void    print()
      {
        cout << id_ << ' ' << name_ << '\n';
      }
    };
    
    int        main()
    {
      Student st1(0, "jack jack");
      Student st2("Dash");
    }