explicit를 사용해서 묵시적 변환을 허용하지 않는 이유

2019. 8. 22. 15:37PL/C++

C++에서는 다음과 같이 기본적으로 묵시적 변환을 허용하고 있다

int num(20)

int &ref(num)

 

묵시적 변환은 변수를 정의할 때, 대입연산자가 생성자 형태로 변환되어서 들어가는 것을 말한다

 

#include <iostream>

using namespace std;

class Simple {
	...	
};

int main(void) {
  Simple s1;
  Simple s2 = s1; // 묵시적 변환으로 Simple s2(s1)으로 복사생성자가 호출된다
  Simple s3 = 3; // 묵시적 변환으로 Simple s3(3)으로 이에 맞는 생성자가 호출된다
  return 0;
}

 

이상할 것이 없이 편해보이지만, 코드 작성에서 코드 어감상 안맞는 부분이 실행이 된다는 점이다. 예를 들어 스택을 클래스가 있다고 가정하고, 스택 사이즈를 매개변수로 전달받는 생성자가 있다. 그러면 explicit를 사용하지 않으면 묵시적 변환을 허용하게 되는데, Stack s1 = 3이라는 코드는 Stack s1(3)으로 묵시적 변환이 되는데, s1 = 3은 실행은 되지만 어감이 맞지 않으므로, explicit로 사전에 실행을 막는다

 

#include <iostream>

class Stack {
private:
	static const int STACK_SIZE;
public:
	...
	explicit Stack(int size = Stack::STACK_SIZE);
};

int main(void) {
	Stack s1;
	Stack s2(10);
	Stack s3 = 2; // 컴파일 에러
	
	return 0;
}

 

 

'PL > C++' 카테고리의 다른 글

const 반환의 의미  (0) 2019.08.22
Default 멤버 함수  (0) 2019.08.22
전위연산자와 후위연산자의 연산자 오버로딩  (0) 2019.08.22
클래스의 static 변수  (0) 2019.08.22
const 키워드  (0) 2019.08.21