Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

Formoat's Open Blog

복사 생성자(Copy Constructor) 본문

C & C++/C++ Basic

복사 생성자(Copy Constructor)

snd-snd 2019. 9. 22. 09:41

복사 생성자

 

말 그대로 객체의 복사본을 생성할 때 호출되는 생성자이다.

클래스를 정의할 때 복사 생성자를 생략할 경우 기본 생성자와 마찬가지로 눈에 보이지는 않지만,

컴파일러가 알아서 복사 생성자를 만들어 준다. 이 때의 복사 생성자는 얕은 복사 생성자이다.

 

복사 생성자에 대해 알려면 먼저 깊은 복사와 얕은 복사에 대해 알아야 한다.

 

 

1. 깊은 복사 (Deep Copy)

 

객체의 멤버 중 값 형식, 참조 형식 모두 복사하여 새롭게 생성하는 경우를 깊은 복사라고 할 수 있다.

값 형식은 얕은 복사도 마찬가지로 새롭게 만들지만 깊은 복사와의 차이점은 참조 형식을 새롭게 만든다는 점이다.

 

2. 얕은 복사 (Shallow Copy)

 

객체의 멤버를 복사하지만 참조 형식의 멤버의 경우 참조하는 포인터를 새롭게 만들고 이 포인터가

복사 대상인 참조 형식의 데이터를 참조하게 한다. 이는 어떠한 면에서는 메모리 사용량을 줄일 수 있지만,

메모리 동적할당을 통한 참조 데이터일 경우 문제가 발생할 수 있어 생각을 해봐야 한다. (댕글링 포인터 발생가능)

 

 

# 복사 생성자 기본 문법 #
클래스이름 (const 클래스이름 &rhs) { ... }

 

#include "stdafx.h"
#include <iostream>
using namespace std;

class Test {
public:
	Test() {} // 기본 생성자

	Test(const Test &rhs) : x(rhs.x), y(rhs.y) // 복사 생성자
	{ 

	}

	void SetData(int _x, int _y)
	{
		x = _x;
		y = _y;
	}

	void Print() {
		cout << x << " " << y << endl;
	}

private:
	int x;
	int y;
};

void main() {
	Test a;
	a.SetData(10, 20);

	Test b(a); //복사 생성자를 호출하는 경우
	a.Print();
	b.Print();
}

 

※ 주의점

 

위에서도 잠깐 설명했지만 객체의 참조 형식 멤버가 메모리 동적 할당을 받은 멤버일 떄 얕은 복사를 한다면

복사된 객체의 멤버 포인터 변수는 원본 객체의 메모리 동적 할당을 받은 데이터를 가르키고 있을 텐데

원본객체의 동적할당된 메모리를 제거하거나, 원본객체 자체를 제거할 경우 복사된 객체의 포인터는

삭제된 데이터를 가르키는 꼴이 된다. 이 경우를 댕글링 포인터(Dangling Pointer)라고 한다.

 

 

 

 

'C & C++ > C++ Basic' 카테고리의 다른 글

이동 생성자(Move Constructor)  (0) 2019.09.22
변환 생성자(Conversion Constructor)  (0) 2019.09.22
클래스(Class)  (0) 2019.09.21
네임 스페이스(Namespace)  (0) 2019.09.21
디폴트 매개변수(Default Parameter)  (0) 2019.09.21
Comments