본문 바로가기
IT/C++(CPP)

CPP 초급 강좌 30. explicit 생성자

by 신림83 2020. 11. 12.
반응형

CPP 초급 강좌 30. explicit 생성자

 explicit 생성자에 대해 봅시다.

다음 코드를 볼까요.

class MyNumber{
private:
	int value;
	
public:
	MyNumber(int value)
	{ 
		this->value = value;
	}
};

int main()
{
	MyNumber n1(1);  //a
	MyNumber n2 = 2; //b
}

 간단하게 숫자 하나를 저장하는 클래스를 만들었고, main에서 객체를 생성합니다.

a n1의 경우는 n1(1); 이란 코드로 직접 초기화를 합니다. direct initialization

b n2는 =을 사용하여 복사 초기화를 합니다. copy initalization

 

 이제는 MyNumber을 인자로 사용하는 함수가 있다면, 다음 코드가 가능할까요?

void f(MyNumber value) {}

int main()
{
	MyNumber n1(1);  //a
	MyNumber n2 = 2; //b

	f(n1);  //c
	f(3);   //d
}

c는 잘 동작합니다. 크게 이상이 없습니다. d는? 잘 동작합니다. d와 같은 코드는 어떻게 동작하는 것일까요?

 이는 함수 인자를 전달 방식에 관하여 아셔야 합니다. 함수 인자 전달 시 복사 초기화를 사용합니다. 3의 입력의 b와 같은 코드로 동작한다는 것이죠. 클래스 설계자는 함수 인자로 전달 시 복사 초기화에 관하여 제어할 수 있습니다.

 

explicit 생성자

class MyNumber{
private:
	int value;
	
public:
	explicit MyNumber(int value)
	{ 
		this->value = value;
	}
};

void f(MyNumber value) {}

int main()
{
	MyNumber n1(1);  //a
	MyNumber n2 = 2; //b

	f(n1);  //c
	f(3);   //d
}

 MyNumber의 생성자를 explicit MyNumber(int value) 라고 수정하였습니다. explicit를 앞에 붙였습니다. 이럴 경우 복사 초기화는 사용할 수 없게 됩니다.

 

복사 초기화 금지. 1
복사 초기화 금지. 2

클래스의 구현 의도에 따라 explicit를 사용하면 됩니다.

 

공부합시다.

봐주셔서 감사합니다.

반응형

댓글