ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 복사생성자
    C++ 언어 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에 대한 복사본이다. 따라서 복사 생성자가 호출 되는 것이다.

     

    'C++ 언어' 카테고리의 다른 글

    Class 멤버 함수의 선언 및 정의 분리  (0) 2020.04.02
    생성자 함수와 소멸자 함수  (0) 2020.04.02
    Class의 생성 과정  (0) 2020.03.31
    함수 템플릿과 인라인 함수  (0) 2020.03.30
    참조자의 내부 동작  (0) 2020.03.27

    댓글

Designed by Tistory.