Study/C++
[C++]복사 생성자(Copy Constructor)
DawIT
2020. 12. 15. 04:15
320x100
얕은 복사와 깊은 복사
C++ 의 복사에는 두가지 개념이 존재한다.
하나는 얕은 복사(swallow copy) 그리고 하나는 깊은 복사(deep copy)
이 둘은 복사할 때 메모리의 할당에서 차이점이 존재한다.
먼저 얕은 복사의 경우는 동적 할당을 받은 변수의 주소값을 공유한다. 즉 포인터 변수를 얕은 복사할 경우 새로운 포인터 변수는 기존 주소값을 가리키게 된다.
깊은 복사는 새로운 동적 할당을 만들고, 원본에 있는 데이터까지 복제한다.
일단 얕은 복사의 문제점
#include <iostream>
using namespace std;
class MyArray {
public:
int size;
int* data;
MyArray(int size)
{
this->size = size;
data = new int[size];
}
~MyArray()
{
if (data != NULL) delete[] this->data;
}
};
int main()
{
MyArray buffer(10);
buffer.data[0] = 1;
MyArray clone = buffer; // 에러
buffer.data[0] = 2;
}
위와 같은 코드에서 에러가 발생한다. 그 이유는 MyArray clone = buffer; 에서 동적 메모리가 해제되었기 때문에 오류를 뱉는 것이다.
복사 생성자란
이러한 문제의 해결을 위해서 복사 생성자(copy constructor)가 존재한다. 이는 객체의 깊은 복사를 도와주는 도구이다.
복사 생성자는 클래스명 (const 클래스명 &참조변수) 의 형태를 가지고 있다. 상단 MyArray의 복사 생성자를 만들어본다.
이러한 형태의 복사 생성자를 정의하였다. 이렇게 되면 복사를 통해 만든 객체도 새로운 동적 메모리를 할당받게 되고 오류가 나지 않게 된다.