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);"を定義してしまうと、コンパイルエラーが起きます。