0

その目的はオーバーロードされたメソッド内の操作ですが、それの本当の目的は何でしょうか?

class CModeType
{
public:
    CModeType(){m_nModeType=1;}
    ~CModeType(){}
    int m_nModeType;
    CModeType&              operator&&( const CModeType& rModeType );
};
CModeType& CModeType::operator &&( const CModeType& rModeType )
{
    this->m_nModeType += rModeType.m_nModeType;
    return *this;
}
int _tmain(int argc, _TCHAR* argv[])
{
    CModeType Mode;
    CModeType Mod2;
    Mode && Mode;
    cout << Mode.m_nModeType << endl; //output:2
    return 0;
}

私も質問したい ||のですが、答えはそれを理解するのに役立つと思います。

4

3 に答える 3

6

しかし、それは本当の目的は何でしょうか?

この場合、その目的は、コードを読みにくくし、直感に反するようにすることです。

実際には、論理積演算子をオーバーロードしたい場合がほとんどありません(これが質問のタイトルに対する答えです)。これはそれらの一部ではありません。

通常、オブジェクトを変更することを予期しないため、または変更する必要がないため、operator &&としてマークする必要があります。constこの場合、そうではありません。論理的に、あなたがした後、あなたは本当にそれを期待しますか?

a && b

a変更されますか?いいえ!それは言語のひどい虐待です。

于 2012-11-28T21:06:18.490 に答える
5

組み込み型の場合、&&演算子は「論理積」であるため、ブール値のコンテキストで評価されたときにx && y両方xとが真である場合にのみ真になります。y

組み込み型の場合、&&演算子は短絡さif (p && *p == 10)れているため、最初の引数がすでにfalseの場合、2番目の引数は評価されません。したがって、nullポインターの逆参照のリスクを冒さずに、次のように言うことができます。ユーザー定義型のオーバーロードoperator&&の場合、これは真ではなく、単なる通常の関数です(したがって、引数は不確定な順序で評価されます)。注意してください!

于 2012-11-28T21:06:06.460 に答える
0

論理and演算子を意味します。コードif (a && b) { ... }では、とが両方ともtrueの...場合にが実行されます。ab

CModeType& operator&&( const CModeType& rModeType )コードでは、演算子をオーバーロードしているため、実装で定義されたまったく新しい目的を与えています。thisおよびrModeType(パラメータ)のm_nModeTypeを合計してから、へのポインタを返しますthis。私にはかなり愚かで非論理的なようです、そうしないことをお勧めします。

于 2012-11-28T21:07:38.117 に答える