명시적 형변환
int intVal = 2;
float floatVal = (float)intVal;
float floatVal = float(intVal);
아래와 같은 차이가 존재한다.
int first = 5;
int second = 2;
float floatVal = first / second;
float floatVal2 = (float) first / second;
std::cout << floatVal << std::endl;
std::cout << floatVal2 << std::endl;
// 결과는
// 2
// 2.5
explicit이 없을 경우
class Tmp {
public:
Tmp(int num) :
m_num(num) {
std::cout << "Tmp 생성자 : " << m_num << std::endl;
}
void print() {
std::cout << "Tmp 내부 값 : " << m_num << std::endl;
}
private:
int m_num;
};
void test(Tmp tmp) {
tmp.print();
}
int main(void) {
test(10);
}
/*
Tmp 생성자 : 10
Tmp 내부 값 : 10
*/
// 명시적 형변환
Tmp tmp1 = Tmp(1);
// 묵시적 형변환
Tmp tmp2 = 10;
explicit이 있을 경우
class Tmp {
public:
explicit Tmp(int num) :
m_num(num) {
std::cout << "Tmp 생성자 : " << m_num << std::endl;
}
void print() {
std::cout << "Tmp 내부 값 : " << m_num << std::endl;
}
private:
int m_num;
};
void test(Tmp tmp) {
tmp.print();
}
int main(void) {
test(10);
}
/*
error: cannot convert ‘int’ to ‘Tmp’
42 | test(10);
*/
int를 바로 Tmp 객체로 대입할 수 없다는 에러가 발생한다. 따라서 이를 정상 동작시키려면, test 함수 호출 전 Tmp 객체를 하나 만들어서 그걸 전달해줘야 한다.
Tmp tmp(10);
test(tmp);
또는
// 명시적 형변환
Tmp tmp1 = Tmp(1);
// 묵시적 형변환
Tmp tmp2 = 10; // Error: conversion from ‘int’ to non-scalar type ‘Tmp’ requested
출처 : https://yaaam.tistory.com/entry/CC-explicit-%ED%82%A4%EC%9B%8C%EB%93%9C%EB%9E%80
'프로그래밍 언어 > C++' 카테고리의 다른 글
C++ 4가지 타입의 캐스팅 (0) | 2022.07.22 |
---|---|
C++ 클래스 타입 업/다운 캐스팅 (Up-DownCasting) (0) | 2022.07.22 |
C++ 상수식 (constexpr) (0) | 2022.07.22 |
C++ 클래스 상속 불가 및 함수 오버라이딩 불가 (final) (0) | 2022.07.21 |
C++ 중첩 클래스 (Nested Class) (0) | 2022.07.20 |