[C++] explicit

연두비두밥·2024년 2월 16일
post-thumbnail

explicit란?

C++ 컴파일러가 암시적으로 형변환을 일으키지 않도록 하는 키워드. 즉, 명시적인 형변환만 가능하도록 만드는 것이다.
주로 생성자에서 활용한다.

#include <iostream>

class Money
{
public:
    Money() : amount{ 0.0 } {};
    explicit Money(double _amount) : amount{ _amount } {};

    double amount;
};

void display_balance(const Money balance)
{
    std::cout << "The balance is: " << balance.amount << std::endl;
}

int main(int argc, char* argv[])
{
    Money payable{ 79.99 };    
    // Legal: direct initialization is explicit.

    display_balance(payable); // 1  
    // Legal: no conversion required
    display_balance(49.95); // 2
    // Error: no suitable conversion exists to convert from double to Money.
    display_balance((Money)9.99f); // 3 
    // Legal: explicit cast to Money

    return 0;
}

명시적 변환 생성자를 사용하여 payable에 대한 직접 초기화를 수행할 수도 있다. 대신 Money payable = 79.99;을 복사 초기화하려는 경우에는 오류가 됩니다. (아래와 같은 경우를 말합니다)

Money paybale = 79.99;
  1. display_balance에 대한 첫 번째 호출의 경우 인수의 형식이 올바르므로 오류가 나지 않습니다.
  2. 두 번째 호출의 경우에는 암시적 변환을 수행하는데 변환 생성자를 사용할 수 없으므로 오류입니다.
  3. 세 번째 호출의 경우 명시적 캐스팅으로 Money에 유효하지만 컴파일러가 암시적 캐스트 float를 삽입하여 double 캐스트를 완료하는 데 여전히 도움이 되었음을 알 수 있습니다. 명시적으로는 Money이므로 오류가 발생하지 않습니다.

정리

암시적 변환을 유도할 수 있다는 편리함이 있긴 하지만 찾기 어려운 버그가 발생할 수도 있습니다. 암시적으로 발생될 특정 변환을 원하는 것이 확실한 경우 이외에는 모든 변환 생성자를 명시적으로 사용하는 것이 좋습니다.

profile
꾸준하고 싶은 사람

0개의 댓글