簡體   English   中英

了解操作員

[英]Understanding Operators

我們的教授給了我們一個實踐測試,並給出了答案,以幫助我們進行即將到來的測試。 我不明白此代碼的答案是135

我了解什么是課程,但我正在努力解決操作員的工作方式。 對於v{6}我知道對於對象vint v等於13 我認為在int main中, (-v - v).print中的第一個-v將首先在返回2 * v的運算符中求值,並且它將返回26 然后我以為他們會放在最后一個運算符中

V operator-(int lop, const V& rop)
{
    return rop - lop;
}

但我認為情況並非如此。 我已經將這段代碼放入Visual Studio中進行處理,但是我不知道發生了什么。

#include <iostream>
using namespace std;

class V
{
    int v;

public:
    V(int a = 3, int b = 7) : v{a + b}
    {
    }

    void print()
    {
        cout << v;
    }

    V operator-(const V& rop) const
    {
        return (3 * v) + (2 * rop.v) + 3;
    }

    V operator-()
    {
        return 2 * v;
    }
};

V operator-(int lop, const V& rop)
{
    return rop - lop;
}

int main() 
{
    V v{6};
    (-v - v).print();

    return 0;  
}

哇,這真是令人困惑的代碼,其中包含重復使用的變量名,奇怪的非常規操作等。 該代碼特別難於遵循,因為V可以由一個整數隱式構造,並且始終將7附加到該整數。 即使使用調試器,這也花了我一些時間。 請不要寫這樣的代碼,甚至不要為了好玩!

main-v的結果不是int 這是一個V對象,由表達式2 * v (= 26)隱式構造,得到一個值為33(26 + 7)的成員整數。

就像您寫了一樣:

V operator-()
{
    return V(2 * v);
}

或者,由於默認參數:

V operator-()
{
    return V(2 * v, 7);
}

然后,將這個新的返回對象作為對象,並將其提供給成員operator-(const V&) ; 同樣的故事適用。 它產生表達式3*33 + 2*13 + 3 ,即128; 再次使用它來構造一個新的V (因為這是返回類型!),所以加7以獲得135。

operator-(int lop, const V& rop)不會出現在其中,因為您從未在intV之間執行減法。

-v的結果不是int ,而是V
因此,將使用成員重載的減法。

這是等效的代碼,沒有運算符的語法糖,但是帶有返回值的顯式轉換:

class V
{
public:
    V(int a = 3, int b = 7) : v{a + b}
    {
    }

    void print()
    {
        cout << v;
    }

    V subtract(const V& rop) const
    {
        return V((3 * v) + (2 * rop.v) + 3);
    }

    V negate()
    {
        return V(2 * v);
    }
private:
    int v;
};


int main() 
{
    V v{6};
    (v.negate().subtract(v)).print();

    return 0;  
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM