expilict 키워드를 사용한다면 컴파일러가 알아서 형변환 하는것을 막을 수 있다.
아래 코드를 보면 기본 생성자에 explicit를 하지 않는다면, 컴파일러 시 의도치 않은 형변환이 일어날 수 있다.
- 명시적 형변환
Tmp tmp1 = Tmp(1);- 묵시적 형변환
Tmp tmp2 = 10;
#include<iostream>
using namespace std;
class example {
private:
int num;
public:
explicit example() {
num = 1;
}
explicit example(int num)
:num{ num } {};
void printNum() {
cout << num << endl;
}
};
int main() {
example A(10);
example B;
B = 15; => error 묵시적 형변환 불가
// B는 example타입을 주어야 하는데, int형 자료를 받을 수 없음.
B = A;
// 이것은 가능. A도 example타입이기 때문.
A.printNum();
B.printNum();
return 0;
}
#include<iostream>
using namespace std;
class example {
private:
int num;
public:
example() {
num = 1;
}
example(int num)
:num{ num } {};
void printNum() {
cout << num << endl;
}
};
int main() {
example A(10);
example B;
B = 10; => 묵시적 형변환 시행. error X
A.printNum();
B.printNum();
return 0;
}
- 정리
explicit는 묵시적 형변환을 막아주는 역할을 한다.
생성자 앞에 explicit가 선언되었다면, 이 생성자로 만든 변수들은 묵시적 형변환이 불가능하다.
- 예시
example A;
A=10; => error
Example B{5};
A=B; =>가능