본문 바로가기
프로그래밍/C++

C++ 복사 생성자, 왜 그렇게 생겼냐?

by Hwan2 2019. 2. 24.
728x90
반응형

 

 

 

 

 

 

복사생성자를 보면 이렇습니다.

 

클래스 이름 (const 클래스 이름 &참조변수)

 

즉, 상수로 선언된 참조자이며 type은 클래스(자기자신)이 되는 것입니다.

 

복사 생성자 자체는 원래 기존 값을 복사해 전달해주는 개념이라

 

이 과정에서 값이 바뀌어선 안됩니다.(복사인데 값이 바뀌게 된다면 복사가 아니겠죠?)

 

따라서 const로 선언된 것이고 정의되어 있습니다.

 

그렇다면 왜 참조자로 받느냐 인데.........

 

이걸 이해 하려면 우선 복사 생성자의 호출을 알아야 합니다.

 

복사생성자가 호출될 때는 

 

1. 대입연산을 할 때

2. 매개 변수로 들어갈 때

3. 반환 값이 있을 때

 

즉, 

#include <iostream>
#include <string>

using namespace std;

class A {
    int num;
    string name;
public:

    A() {}
     
    A(int num, string name) {
        this->num = 10;
        this->name = name;
    }

     
    A(const A &ref) {       //디폴트 복사 생성자
        num = ref.num;
        name = ref.name;

        cout << "복사 생성자 호출" << endl;
    }
     
    void fct_1(A obj) {
        cout << "fct_1 함수 실행" << endl;
    }

    A fct_2(void) {
        A obj;

        cout << "fct_2 함수 실행" << endl;

        return obj;
    }

};

int main(void) {

    A a(10, "Hwan");
      
    a.fct_1(a);
    cout << "fct_1 함수 실행 끝" << endl;
    A b = a.fct_2();
    cout << "fct_2 함수 실행 끝" << endl;

    return 0;
}
 

 

이렇게 호출이 됩니다.

 

44행의 a.fct_1(a); 부분을 보면 아래와 같이 진행됩니다.

 

 

 

이런식으로 복사생성자가 실행되게 됩니다.

 

 

 

46행의 함수호출 a.fct_2()는 다음과 같이 실행되게 됩니다.

 

 

 

이런식으로 실행이 되게 됩니다.

 

즉, 위에서 말한대로 

1. 대입연산을 할 때

2. 매개 변수로 들어갈 때

3. 반환 값이 있을 때

 

이러한 경우마다 실행이 되는데, 참조를 하게 되면 생성자 호출, 복사 생성자 호출을 안하게 됩니다.(무시함)

 

만약 참조자가 아닌 그냥 매개변수로 받게 된다면?

 

즉, A(const A &ref) -> A(const A ref)로 바꾸게 된다면.....

 

무한 루프에 빠지게 됩니다.

 

왜냐??

 

A(const A ref)는 새로운 A ref 에 대한 변수선언 임으로 복사생성자가 호출될 것입니다. 

계속.......

 

때문에 복사 생성자가 무한 반복 일어나면 안되기 때문에 참조자로 받아 복사 생성자의 호출을 하지 않는 것입니다.

 

 

 

 

반응형

댓글


스킨편집 -> html 편집에서