공부 중 메모/수업 예제 (KGCA)

Cpp 복사 생성자 예제 (explicit, mutable)

라이피 (Lypi) 2018. 7. 14. 18:24
반응형

출처 : KGCA 게임 아카데미(http://www.kgcaschool.com/). 수업 예제 파일.


explicit : 생성자 앞에 붙여서 묵시적 형변환을 금지하는 키워드

mutable : 변수 앞에 붙여서 const함수에서도 값이 변경될 수 있도록 하는 키워드.


classes.h

 #pragma once
#include <iostream>

class class_A
{
private:
	int m_iValue;

public:

	int Get() const { return m_iValue; }

	class_A(int iValue) : m_iValue(iValue) {}
	class_A(class_A& copy) : m_iValue(copy.m_iValue) {}
	~class_A() { }
};

class class_E
{
private:
	int m_iValue;

public:
	int Get() const	{ return m_iValue; }

	//explicit는 생성자 앞에 붙여서 묵시적인 호출을 방지한다. 
	//이는 명시적인 호출만 가능토록 한다.
	explicit class_E(int iValue) : m_iValue(iValue) {}
	
	//explicit를 복사 생성자에 사용하면 
	//대입 연산자를 통하여 객체의 생성 및 초기화를 할 수 없다.
	explicit class_E(class_E& copy) : m_iValue(copy.m_iValue) {}
	
	~class_E() { }
};

class class_M
{
private:
	int m_iValue;

	//mutable이 붙은 변수는 const함수에서도 변경이 가능하다.
	//즉 이는 const에 대한 예외가 된다.
	mutable int m_iData;

public:
	int Get() const
	{
		return m_iValue;
	}

	int Get(int iValue) const
	{
         m_iData = iValue;     //가능
	   //m_iValue = iValue;    //불가능
	     return m_iData;
	}

	explicit class_M(int iValue) : m_iValue(iValue)	{ }
	explicit class_M(class_M& copy) : m_iValue(copy.m_iValue) { }
	~class_M() { }
};

main.cpp

 #include "classes.h"

int main()
{
	class_A tA(3);
	class_A tB = 4;
	class_A tC = tA;

	class_E tD(5);
	//class_E tE=3 // Error 묵시적 변환이 발생하지 못한다.
	class_E tE(tD); //OK

	class_M tF(6);

	std::cout << "tA : "<< tA.Get() << std::endl;
	std::cout << "tB : "<< tB.Get() << std::endl;
	std::cout << "tC : "<< tC.Get() << std::endl;
				
	std::cout << "tD : "<< tD.Get() << std::endl;
	std::cout << "tE : "<< tE.Get() << std::endl;
				 
	std::cout << "tF : "<< tF.Get() << std::endl;
	std::cout << "tF : "<< tF.Get(7) << std::endl;
}


반응형