영넌 개발로그

[C++ 기초] Copy constructor (deep copy, shallow copy) 본문

코딩/C++

[C++ 기초] Copy constructor (deep copy, shallow copy)

영넌 2020. 12. 4. 04:44

Copy constructor

새로운 객체를 만들 때, 다른 객체의 내용을 복사해서 만드는 경우 호출되는 생성자

원래 오리지널 생성자는 호출되지 않는다.

 

- 컴파일러에 의해 자동으로 생성된다. 모든 member variable을 자동 복사한다.

- 별도로 만들 수도 있다.

 생성자와 동일하되, 인수는 객체에 대한 reference variable을 받는다.

 member variable 복사를 직접 모두 처리해줘야 한다.

 특별한 일을 더 해야 한다면 별도로 만들어야 한다.

 

 

Shallow copy

컴파일러 자동 생성 방법>

class Car
{
private:
	int year;
public:
	Car(int _year) : year(_year) {
		cout << "original constructor was called " << endl;
	}
	void showYear()
	{
		cout << "This car was made in " << year << endl;
	}
};


int main() {
	Car c(2010);
	c.showYear(); //2010
	
	//c를 복사해서 객체 d와 e를 만드는 방법 (컴파일러 자동 복사)
	//일반 생성자가 실행되지 않음을 볼 수 있음
	Car d = c;
	Car e(c);

	d.showYear(); //2010
	e.showYear(); //2010


	return 0;
}

실행 결과

Shallow copy

별도로 만들어 주는 방법>

#include <iostream>

using namespace std;


class Car
{
private:
	int year;
public:
	Car(int _year) : year(_year) {
		cout << "original constructor was called " << endl;
	}
	Car(Car& _c) {
		cout << "copy constructor was called" << endl;
		year = _c.year;
	}
	void showYear()
	{
		cout << "This car was made in " << year << endl;
	}
};


int main() {
	Car c(2010);
	c.showYear(); //2010
	
	Car d = c;
	Car e(c);

	d.showYear(); //2010
	e.showYear(); //2010


	return 0;
}

실행 결과

 

 

 ***** 아래와 같은 코드는 Copy Constructor에 의해 새로 생성되는 것이 아닌, 

f를 생성한 뒤에 c의 "값을 복사"만 하는 것을 의미한다. *****

	Car f(2030);
	f = c;

 

Deep copy

***** 아래와 같은 코드에서 소멸자에 의해 d가 사라지면 c가 가리키고 있는 공간도 사라지게 된다.

따라서 복사를 해줄 때, 공간을 다시 할당해주어야 d가 사라져도 c를 다시 사용하는데에 오류가 없다.

이때, 필요한 것이 Copy Constructor이다.

class Car
{
private:
	int year;
	char* ptr;
public:
	Car(int _year) : year(_year) {
		cout << "original constructor was called " << endl;
		ptr = new char[30000000];
	}
	~Car() {
		delete[] ptr;
	}
	Car(Car& _c) {
		cout << "copy constructor was called" << endl;
		year = _c.year;
		ptr = new char[30000000];
	}
};


int main() {
	Car c(2010);
	{
		Car d = c;
	}

	return 0;
}

 

 

 

Comments