2013-12-19 13 views
9

私は自分のために答えることができない質問を横断しました。また、私はこれとGoogleとの両方で答えを見つけられませんでした。オブジェクトが `!obj`の式で使用される` operator! `と` operator bool`の両方を提供するとき?

MyClass myObject; 

// [some code, if any] 

if (!myObject) 
{ 
    // [do something] 
} 

MyClassはこのような何かに定義されてみましょう:今

class MyClass 
{ 
public: 
    MyClass() { }; 
    virtual ~MyClass() { }; 
    bool operator!() 
    { 
     return !myBool; 
    }; 
    operator bool() 
    { 
     return myBool; 
    }; 
private: 
    bool myBool = 0; 
}; 

私の質問です:のどちらそうは次のように私は、if節に「有効性のためにオブジェクトをチェック」したい、と言いますオーバーロードされた演算子は実際にこのif節で使用されますか?いずれにしても、結果は明らかに同じです。

+0

私はそれが最も抵抗の少ない道を行くと思うし、 'operator! 'と呼ぶでしょう... – StoryTeller

+2

これを読むまで、ブールのオーバーロードについては考えないでください:http://stackoverflow.com/questions/6242768/is-the-safe-bool-idiom-in-c11 – Bathsheba

+1

はい、 'operator bool'を実行して明示的にしてください。とにかく、 'operator!'は変換を必要としません。 'operator bool'はユーザ定義の変換を必要とします。 – chris

答えて

8

operator!を使用します。

引数の型と一致する型の関数は、型の変換が必要な型より優先して選択されます。

2

operator !は、最も直接的な解決策であるため、実行されます。代わりにoperator boolを使用した場合は、変換演算子を最初に呼び出してから、!を別途適用する必要があります。

一般的に、そのような状況は避けることをお勧めします。厳密に言えば、MyClassではなく、論理演算子を直接操作する必要があるからです。boolの変換を定義するのが一般的です。両方を定義すると読みやすさの問題が少し発生し、冗長コードの重複の形になります(将来はプログラマーのエラーにつながる可能性があります)。

+0

私は最後の部分で説明した冗長性に同意しません。 'operator bool()'は変換演算子です。したがって、 'bool myTest = myObject;'のような文は、 'operator bool()'がなくても動作しません。 – poljpocket

+1

私はあなたが私を誤解したと思います。私は、 'operator bool' **と**' operator! 'を定義することは、同じ(しかし、逆さまですが)ロジックを不必要に複製しているので、実質的にコードの重複であることを意味しました。 –

関連する問題