轉(zhuǎn)帖|其它|編輯:郝浩|2009-02-20 09:40:42.000|閱讀 558 次
概述:關(guān)于++運(yùn)算符重載的一個問題解析!
# 界面/圖表報表/文檔/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++);
}
}
這段代碼的結(jié)果是b.Measure=6.3, a.Measure=5.3
c.Measure=5.3, b.Measure=5.3
先看第一行結(jié)果,這來自于b=a++ ;這行代碼,由于是后綴運(yùn)算符,所以應(yīng)該先賦值,再++!按照預(yù)期似乎b.Measure應(yīng)該是等于5.3,但是結(jié)果是6.3!
這個可以這樣來解釋,在MSDN中x++會按如下步驟來處理:
x
以產(chǎn)生變量。x
的值。x
值作為參數(shù)。x
的計(jì)算結(jié)果給定的位置中。x
的保存值成為運(yùn)算結(jié)果。
我們來套用這個來解釋b=a++的結(jié)果,
1,由于a已經(jīng)是變量了,第一步被跳過。
2,保存a的值(注意a為引用類型的實(shí)例,這比較重要)
3,調(diào)用選定運(yùn)算符(這里也就是調(diào)用自定義的運(yùn)算符重載方法),將a的作為參數(shù)來傳遞,由于a是引用類型的實(shí)例,所以在重載方法執(zhí)行的時候?qū)?參數(shù)進(jìn)行的操作會影響傳遞進(jìn)來的實(shí)參(也就是影響a的值),這里進(jìn)行了d.m_Measure++操作,所以改變了a的值,這時第二步保存的a的值也做了改變,這時a.Measure已經(jīng)是6.3了。
4,將運(yùn)算符返回的值存儲在給定的位置中,這里保存的是我們自定義的運(yùn)算符重載方法的返回值,這里由于我們使用了return new Distance(d.m_Measure++);作為返回值,注意d.m_Measure++使用的是后綴運(yùn)算符,所以這里返回結(jié)果的Mesure值是5.3
5,第2步保存的值成為運(yùn)算結(jié)果(這里在第3步改變了第2步保存的值)
所以這里b.Measure=6.3,至于為什么a.Measure又等于5.3了,這個也比較容易解釋了,在b=a++執(zhí)行后,a就要更新了,這里a就被賦值為第4步的計(jì)算結(jié)果,所以a.Measure又等于5.3了!
如果有什么漏洞,請大家多多指教!
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:博客園