轉帖|其它|編輯:郝浩|2009-02-20 09:40:42.000|閱讀 558 次
概述:關于++運算符重載的一個問題解析!
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
問題起源于下面這段有問題的代碼:
class Program
{
static void Main(string[] args)
{
Distance a = new Distance(5.3);
Distance b = a++;
Console.WriteLine("b.Measure={0}, a.Measure={1}", b.Measure, a.Measure);
Distance c = ++a;
Console.WriteLine("c.Measure={0}, a.Measure= {1}", c.Measure, a.Measure);
}
}
public class Distance
{
private double m_Measure = 0.0;
public double Measure
{
get
{
return m_Measure;
}
set
{
m_Measure = value;
}
}
public Distance(double d)
{
m_Measure = d;
}
public static Distance operator ++(Distance d)
{
return new Distance(d.m_Measure++);
}
}
這段代碼的結果是b.Measure=6.3, a.Measure=5.3
c.Measure=5.3, b.Measure=5.3
先看第一行結果,這來自于b=a++ ;這行代碼,由于是后綴運算符,所以應該先賦值,再++!按照預期似乎b.Measure應該是等于5.3,但是結果是6.3!
這個可以這樣來解釋,在MSDN中x++會按如下步驟來處理:
x
以產生變量。x
的值。x
值作為參數。x
的計算結果給定的位置中。x
的保存值成為運算結果。
我們來套用這個來解釋b=a++的結果,
1,由于a已經是變量了,第一步被跳過。
2,保存a的值(注意a為引用類型的實例,這比較重要)
3,調用選定運算符(這里也就是調用自定義的運算符重載方法),將a的作為參數來傳遞,由于a是引用類型的實例,所以在重載方法執行的時候對參數進行的操作會影響傳遞進來的實參(也就是影響a的值),這里進行了d.m_Measure++操作,所以改變了a的值,這時第二步保存的a的值也做了改變,這時a.Measure已經是6.3了。
4,將運算符返回的值存儲在給定的位置中,這里保存的是我們自定義的運算符重載方法的返回值,這里由于我們使用了return new Distance(d.m_Measure++);作為返回值,注意d.m_Measure++使用的是后綴運算符,所以這里返回結果的Mesure值是5.3
5,第2步保存的值成為運算結果(這里在第3步改變了第2步保存的值)
所以這里b.Measure=6.3,至于為什么a.Measure又等于5.3了,這個也比較容易解釋了,在b=a++執行后,a就要更新了,這里a就被賦值為第4步的計算結果,所以a.Measure又等于5.3了!
如果有什么漏洞,請大家多多指教!
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:博客園