서론
이 장은 Explicit에 대해서 설명한다.
목차
Explicit Type Casting(명시적 형변환)
변수명 앞에 자료형을 명시적(보이게)으로 붙여줘 값을 변환
int val = 2;
float floatval = (float) val; //명시적 형변환
Implicit Type Casting(묵시적 형변환)
변수명 앞에 자료형을 붙여주지 않고 값을 변환
int first = 5;
int second = 2;
float floatVal = first / second; //묵시적 형변환
묵시적 형변환의 경우 값의 소실이 있을 수 있다
- int→float는 값의 소실 X
- float→int는 값의 소실 O
따라서값의 소실이 발생할 가능성에 대해 묵시적 형변환을 하지 못하게 막도록 하는 키워드가 Explicit이다.
Explicit을 적용하지 않음
- impTypeCasting 함수를 Call하여 Foo라는 객체를 생성한다.
- Foo 타입의 인자가 아니라 int형태의 인자를 넘겨준다.
- 컴파일러는 자동으로 Foo클래스의 int형 생성자(Foo (int val1))을 자동으로 호출한다.(묵시적 형변환)
#include <iostream>
class Foo {
public :
int value1;
Foo() : value1(0) {
std::cout << "1-init: " << std::endl;
}
Foo(int val1) : value1(val1) {
std::cout << "2-init: " << std::endl;
}
void printValue(){
std::cout << value1 << std::endl;
}
};
void impTypeCasting(Foo a){
a.printValue();
}
int main(void) {
impTypeCasting(100);
}
출력결과

Explicit을 적용
위의 묵시적 형변환을 막는 경우다.
#include <iostream>
class Foo {
public :
int value1;
Foo() : value1(0) {
std::cout << "1-init: " << std::endl;
}
explicit Foo(int val1) : value1(val1) {
std::cout << "2-init: " << std::endl;
}
void printValue(){
std::cout << value1 << std::endl;
}
};
void impTypeCasting(Foo a){
a.printValue();
}
int main(void) {
impTypeCasting(100);
}
출력결과 :

위 에러를 해결하려면 다음과 같은 문법을 사용해야 한다.
#include <iostream>
class Foo {
public :
int value1;
Foo() : value1(0) {
std::cout << "1-init: " << std::endl;
}
explicit Foo(int val1) : value1(val1) {
std::cout << "2-init: " << std::endl;
}
void printValue(){
std::cout << value1 << std::endl;
}
};
void impTypeCasting(Foo a){
a.printValue();
}
int main(void) {
impTypeCasting(Foo(100)); //요기가 다름
}
출력결과 :

Comment