21項 暗黙的な型変換を避けるためのオーバーロード

暗黙的な型変換を避けるためのオーバーロード



下の例では、暗黙的な型変換が行われています。

class UPInt{
public:
    UPInt();
    UPInt(int value);
    ...
};

const UPInt operator +(const UPInt &lhs, const UPInt &rhs);



UPInt upi1, upi2;

UPInt upi3 = upi1 + upi2;

upi3 = upi1 + 10; //operator +(upi1, UPInt(10))のように振る舞う

upi3 = 10 + upi1; //operator +(UPInt(10), upi1)のように振る舞う

暗黙的な型変換を行うために、テンポラリーオブジェクトが作成されています。



テンポラリーオブジェクトを作成させないようにするには、UPIntとintを引数とする+演算子オーバーロードを行います。

class UPInt{
public:
    UPInt();
    UPInt(int value);
    ...
};

const UPInt operator +(const UPInt &lhs, const UPInt &rhs);
const UPInt operator +(const UPInt &lhs, int rhs);
const UPInt operator +(int lhs, const UPInt &rhs);



UPInt upi1, upi2;

UPInt upi3 = upi1 + upi2;

upi3 = upi1 + 10; //テンポラリーオブジェクトなし

upi3 = 10 + upi1; //テンポラリーオブジェクトなし

勢い余って、"const UPInt operator +(int lhs, int rhs);"を定義してしまうと、コンパイルエラーが起きます。