-
복사생성자란 ?
복사생성자는 말 그대로 객체의 복사본을 생성할 때 호출되는 생성자이다.
기본적으로 객체를 만들면 디폴트 생성자가 실행된다. 이때 만약 객체를 만들긴 만들었지만 해당 객체가 다른 객체의 복사본 으로 생성되었을 경우 복사생성자가 호출되게 되는 것이다. 아래 예시를 보자
// 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에 대한 복사본이다. 따라서 복사 생성자가 호출 되는 것이다.
'C++ 언어' 카테고리의 다른 글
Class 멤버 함수의 선언 및 정의 분리 (0) 2020.04.02 생성자 함수와 소멸자 함수 (0) 2020.04.02 Class의 생성 과정 (0) 2020.03.31 함수 템플릿과 인라인 함수 (0) 2020.03.30 참조자의 내부 동작 (0) 2020.03.27