[英]Understanding Operators
我們的教授給了我們一個實踐測試,並給出了答案,以幫助我們進行即將到來的測試。 我不明白此代碼的答案是135
。
我了解什么是課程,但我正在努力解決操作員的工作方式。 對於v{6}
我知道對於對象v
, int 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)
不會出現在其中,因為您從未在int
和V
之間執行減法。
-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.