C++ 언어

복사생성자

JongSeok_12 2020. 4. 6. 22:45

복사생성자란 ?

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

기본적으로 객체를 만들면 디폴트 생성자가 실행된다. 이때 만약 객체를 만들긴 만들었지만 해당 객체가 다른 객체의 복사본 으로 생성되었을 경우 복사생성자가 호출되게 되는 것이다. 아래 예시를 보자

// HelloNew_C+.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다.
//

#include "stdafx.h"
#include<iostream>
#include<stdio.h>

class CMytest
{
public:
	// 디폴트 생성자 소멸자
	CMytest()
	{
		this->m_nData = 10;
		std::cout << "디폴트 생성자 호출입니다" << m_nData << std::endl; 
	}
	~CMytest(){}

	// 복사 생성자 소멸자
	CMytest(const CMytest &rhs)
		// 아래와 같이 생성자 초기화 목록을 사용해
		// rhs의 멤버 m_nData 의 값으로 초기화
		: m_nData(rhs.m_nData)
	{
		// this 포인터의 m_nData 멤버에 매개변수로 전달 된 클래스 참조자 rhs의
		// 멤버 m_nData의 값을 단순대입
		this->m_nData = rhs.m_nData;  
		std::cout << "복자 생성자 호출입니다" << m_nData<< std::endl;
		                                    
	}
private:
	int m_nData;
};



int _tmain(int argc, _TCHAR* argv[]){

	// Class CMytest의 객체 a 생성
	CMytest a;

	// 객체 a의 복제본 객체 b를 생성
	CMytest b(a);

	return 0;
}


가장 먼저 객체 a를 생성했을시 디폴트 생성가자 실행되며 멤버 변수 m_nData 가 10으로 초기화 된다. 이때 객체 a를 복제하는 객체 b를 생성할 경우 복사 생성자가 호출되며 객체 b의 멤버 변수인 m_nData가 객체 a의 값을 복사한 10으로 초기화 된다.   

 

복사 생성자 호출 방법

복사 생성자를 호출하는 방법은 크게 두가지가 존재한다.

1. 명시적으로 객체의 복사본을 생성하는 방식이다. 

(원본 a 생성) Ctest a      ---->       (원본 a에 대한 복사본 b 생성) Ctest b (a)

2. 함수형태로 복사 생성자 호출

(원본 a 생성)  Ctest a      ---->      (원본 a를 매개변수로 받는 함수 copy_func 호출)  copy_func (a) 

// HelloNew_C+.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다.
//

#include "stdafx.h"
#include<iostream>
#include<stdio.h>
using namespace std;
class Ctest
{
public:
	// 다중 정의 생성자
	// 정수를 매개변수로 받아 m_nData를 매개변수 값으로 초기화
	Ctest(int n): m_nData(n){} 

	// 복사 생성자
	// 매개변수로 Ctest 객체의 참조자를 매개변수로 받는다
	// this 포인터(객체 자신의 주소)의 멤버 m_nData를
	// 매개변수로 받은 객체의 멤버 m_nData의 값으로 초기화
	Ctest(Ctest &rhs) {
		this->m_nData = rhs.m_nData;
	}

	// m_nData를 읽기 위한 함수
	// m_nData는 접근제어 상태이기 때문에 사용자 측에서 접근 불가
	// 따라서 멤버 함수를 통해 접근해야 한다.
	int read_data(){
		return this->m_nData;
	}

	// m_nData를 쓰기 위한 함수
	// m_nData는 접근제어 상태이기 때문에 사용자 측에서 접근 불가
	// 따라서 멤버 함수를 통해 접근해야 한다.
	void write_data(int nParam){
		this->m_nData = nParam;
	}
private:
	int m_nData;
};

// 복사 생성자 호출함수
// 매개변수로 Ctest 객체가 넘어간다
// 만약 a라는 객체가 매개변수로 넘어간다면 param은 a객체의 복사 객체가 된다.
// 따라서 Ctest Class의 복사 생성자가 호출된다.
// Ctest param(실 인수)

void copy_func(Ctest param){
	param.write_data(20);
}



int _tmain(int argc, _TCHAR* argv[]){

	// a 객체의 멤버 m_nData(10) 초기화
	Ctest a(10); 

	// void copy_func(Ctest param(a))
	// 따라서 복사 생성자 호출
	copy_func(a); 

	cout << a.read_data() << endl;

	      


	return 0;
}


 위의 자료는 함수를 이용한 복사 생성자 호출과정을 다룬 것이다.

복사 생성자 호출 함수인 copy_func 함수는 매개변수로 복사할 대상이 되는 Ctest 객체를 매개변수로 받는다. 내부적으로는 다음과 같이 동작한다.

함수 원형 void copy_func ( Ctest param )    --->    매개변수로 객체 a전달     ---->   Ctest param(a)

위와 같이 param 이라는 새로운 Ctest 객체가 생성되며 param 객체는 a에 대한 복사본이다. 따라서 복사 생성자가 호출 되는 것이다.