Qaupot Blog
Software Engineering, Trip

304. 1항 연산자 - 변환 연산자

🕐 Thu, 20 Feb 2014 09:00:00 GMT 🕓 Tue, 31 Aug 2021 13:01:00 GMT

1항 연산자 - 변환 연산자 (Conversion Operator)

변환 연산자는 지정된 인스턴스를 다른 자료형 타입으로 변환하는 연산자입니다.

#include <iostream>

class FloatNumber
{
private:
    float val;
public:
    FloatNumber(float val)
    {
        this->val = val;
    }
    
    float getValue(){ return val; }

    operator int()
    {
        return val + 1;
    }
    operator float()
    {
        return val + 2.0;
    }
    operator double()
    {
        return val + 3.0;
    }
};

class Number
{
private:
    int val;
public:
    Number(int val)
    {
        this->val = val;
    }
    int getValue(){ return val; }

    operator FloatNumber()
    {
        return FloatNumber((float)val);
    }
};

int main(int argc, char** argv)
{
    Number num(20);

    // operator FloatNumber()가 있어서 변환 가능하다.
    FloatNumber floatNum = num;

    // 변환 불가능하다.
    // num = floatNum;

    printf("%d\n", (int)floatNum);
    printf("%f\n", (float)floatNum);
    printf("%f\n", (double)floatNum);

    return 0;
}
21
22.00
23.00

변환 연산자는 반환형을 명시하지 않으며, operator '변환 자료형' () 으로 선언합니다.

  • 변환 자료형에 맞는 인스턴스를 반환해야 하며, 묵시적 혹은 명시적으로 호출될 수 있습니다.

FloatNumber()의 구현에 의해, Number 는 FloatNumber 로 묵시적 변환이 가능합니다.

  • FloatNumber 는 int, float, double 에 대한 operator 를 가지고 있습니다.

예제 내 출력문에서 명시적 캐스팅을 사용합니다. 클래스의 인스턴스의 경우 기본 반환이 자신의 인스턴스에 대한 레퍼런스이기 때문입니다. 또한 int, float, double 자료형은 묵시적 변환이 가능하므로, 이를 구별하기 위해 사용합니다.

  • 이미 존재한 num 변수에 대입하는, num = floatNum; 은 불가능 합니다.
  • 새로 생성하는 Number num2 = floatNum; 은 가능합니다.
    • floatNum 이 int 로 묵시적 캐스팅되고, Number 의 생성자(변환생성자)가 int 값을 인수로 받아 호출됩니다.
이 블로그는 개인 블로그입니다. 게시글은 오류를 포함하고 있을 수 있지만, 저자는 오류를 해결하기 위해 노력하고 있습니다.
게시글에 별도의 고지가 없는 경우, 크리에이티브 커먼즈 저작자표시-비영리-변경금지 4.0 라이선스를 따릅니다.

This blog is personal blog. published posts may contain some errors, but author doing efforts to clear errors.
If post have not notice of license, it under creative commons Attribution-NonCommercial-NoDerivatives 4.0.