본문 바로가기

프로그래밍/C++

복사생성자

다른 객체의 데이터를 복사해서 객체를 생성할 수 있도록 해주는 생성자이다.

 

만약 복사생성자가 없다면 기본 복사생성자를 활용하게 된다.

인자로 해당 클래스의 객체를 받게 되어있고 그 객체를 복사해주게 된다.

 

얕은 복사 (Shallow Copy)

 : 단순한 값을 복사하는 방식이다. 기본 복사생성자는 얕은복사를 해준다.

 

깊은 복사 (Deep Copy)

 : 값 뿐만 아니라 동적할당된 공간은 새로 공간을 할당해주고 기존 객체의 동적할당된 공간의 값을 새로 할당된 공간에 복사해주는 방식이다.

 

class SoSimple
{
private:
        int num1;
        int num2;
        
public:
        SoSimple(int n1, int n2)
               : num1(n1), num2(n2)
        {
        }
        void ShowSimpleData()
        {
               cout << num1 << endl;
               cout << num2 << endl;
        }
};
int main()
{
        SoSimple sim1(15, 20);
        SoSimple sim2 = sim1;
        sim2.ShowSimpleData();
        return 0;
}

 

1.

SoSimple sim2 = sim1;

sim2 객체를 새로 생성해서, 객체 sim1과 객체 sim2 간의 멤버 대 멤버 복사가 일어난다.

 

2.

SoSimple sim2(sim1);

SoSimple형 객체를 생성하고, 객체의 이름은 sim2, sim1을 인자로 받을 수 있는 생성자의 호출을 통해서 객체생성을 완료한다.

 

1에서 2로 자동적으로 묵시적 변환이 일어난다.

 

SoSimple(const SoSimple &copy)
               : num1(copy.num1), num2(copy.num2)
        {
        }

멤버 대 멤버의 복사에 사용되는 원본을 변경시키는 것은 복사의 개념을 무너뜨리는 행위가 되므로, const를 삽입해서 이러한 실수를 막아놓는 것이 좋다.

 

explicit SoSimple(const SoSimple &copy) :
               num1(copy.num1), num2(copy.num2)
        {
        }

explicit

 : 1에서 2의 묵시적 변환을 박아준다.

 

복사생성자가 호출되는 시점

 

     1. 기존에 생성된 객체를 이용해서 새로운 객체를 초기화하는 경우

 

     2. Call by value 방식의 함수호출 과정에서 객체를 인자로 전달하는 경우

 

     3. 객체를 반환하되, 참조형으로 변환하지 않는 경우

 

 

'프로그래밍 > C++' 카테고리의 다른 글

template  (0) 2019.06.09
const와 static  (0) 2019.06.04
Reference (참조자)  (0) 2019.06.01
while과 do while, #define과 inline  (0) 2019.05.31
C++ 기초 2  (0) 2019.04.01