ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C++] 다양한 생성자들
    programing/Language 2017. 9. 3. 21:23
    생성자의 대표적인 종류로서 생성자 초기화 목록, 복사 생성자, 이동 시맨틱이 있습니다.
    성자의 특징으로는, 선언된 클래스명과 동일한 이름을 가집니다. 즉 클래스명이 MyClass라면 생상자명도 MyClass가 됩니다.
    그럼 첫번째로 생성자 초기화 목록에 대해 말하자면, 생성자 초기화 목록은 생성자가 호출될때 특정 멤버를 초기화 하는 생성자입니다.

    예를들어  다음과 같은 코드가 있다고 한다면,

    class C{ public:   C(int P) : N(P) {} //생성자 초기화 목록. P는 매개변수. P값을 이용해 N을 초기화 합니다.   GetN(void) { std::cout << N << std::endl; } // 멤버변수 N의 값을 출력하는 함수입니다. private:   int N; //멤버 변수. private이므로 같은 클래스의 멤버만 참조가 가능합니다. }  int main(){  C A(10); // C클래스 인스턴스 A를 선언하면서 정수 10을 함께 넘겨줍니다. 즉, int P에 10이 복사되고 이 P를 이용해 N을 초기화합니다.  A.GetN(); // 실행시 콘솔창에 10이 출력됩니다. return 0; } 

    이와 같이, 생성자 초기화 목록은 선언 및 초기화를 동시에 하는 생성자입니다. 
    C 스타일로 설명하자면 int A=10;과 같은 느낌입니다. 
    굳이 선언과 동시에 초기화를 하는 이유에는, 멤버변수가 참조변수일경우, 참조할 대상이 필요하므로 반드시 선언과 동시에 초기화를 해주어야 합니다.
    또한 선언 후 단순 대입에 비해 메모리 절약이 된다는 장점이 있습니다.

    두번째로 복사생성자가 있습니다.
    복사 생성자는 말그대로 같은 클래스를 이용해서 새로운 클래스 인스턴스를 선언할때 필요한 생성자입니다.
    예를들어, 


    위와 같이 복사 생성자는 단순히 멤버변수를 복사하는 기능만을 가지는게 대부분입니다. 

    마지막으로 이동 시맨틱은 복사 생성자에서 더 발전한 생성자입니다.
    이동 시맨틱은 이동 생성자와 이동 대입 연산자로 구현됩니다. 간단히 말하자면 복사 생성자와 대입 연산자에 R-value 참조를 조합해서 새로운 생성 및 대입의 경우에 대한 함수다중정의를 한것입니다.

    예를들어,

    class C{
    public:
      C() {} // 디폴트 생성자입니다.
      C(const C &rhs) : N(rhs.N) {} // 초기화 생성자 목록을 이용한 복사 생성자입니다.
      C(C &&rhs) : N(Rhs.N) {} // 초기화 생성자 목록을 이용한 이동 생성자입니다.
    ...
    }

    C F(int P){  //반환자료형이 C클래스형이며, 매개변수로 정수형 P를 받는 함수 F입니다.
      C A;
      A.N=P;
      return A; //A를 반환합니다.
    }

    int main(){
      C b;
      b=F(10); //함수 F를 호출해 10을 매개변수로 전달합니다. 그 결과 반환값은 멤버 변수의 값이 10인 임시 C클래스형 인스턴스입니다. 이 인스턴스는
    우변값(R-value)이므로, R-value 참조를 이용해야 합니다.(우변값 참조시엔 &이 아닌 &&을 사용합니다.) 즉, 이 코드가 실행될때 이동생성자인 C(C &&rhs) 함수가 실행됩니다.
      return 0;
    }

    이렇게 수많은 생성자가 있습니다만, 각각 장단점과 주의사항이 있습니다.
    하지만 이 글에서 주의사항에 대해 깊게 서술하지는 않겠습니다.
    여러분들은 그냥 대충 이런 생성자들이 있구나 하는것만 아시면 될 것 같습니다.


    댓글

Designed by black7375.