프로그래밍 언어/C++

C++ 명시적 형변환/캐스팅 (explicit)

ShovelingLife 2022. 7. 22. 09:57

명시적 형변환

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