關(guān)于C/C++中的++i和i++實(shí)現(xiàn)機(jī)制的探討
掃描二維碼
隨時(shí)隨地手機(jī)看文章
int main()
{
int i = 0;
i = i++;
//問(wèn)如果打印i的值,結(jié)果是多少?
return 0;
}
這個(gè)問(wèn)題實(shí)際上涉及到了前置及后置操作符的內(nèi)部實(shí)現(xiàn)問(wèn)題。
下面我們通過(guò)模仿前置和后置操作符的實(shí)現(xiàn)方式,來(lái)加深對(duì)前置、后置操作符實(shí)現(xiàn)原理的理解:
首先,我們使用類MyInt來(lái)模擬整型:
class MyInt{
public:
int value; //實(shí)際的value值
MyInt(int value){ //方便初始化:MyInt i = 0;
this->value = value;
}
/**
* 重寫前置式++運(yùn)算符(++i時(shí)會(huì)自動(dòng)調(diào)用本函數(shù))
* @return 前置式運(yùn)算會(huì)返回當(dāng)前對(duì)象的引用
*/
MyInt& operator++(){
*this += 1; //累加后取出
return *this;
}
/**
* 重寫后置式++運(yùn)算符(i++時(shí)會(huì)自動(dòng)調(diào)用本函數(shù))
* 注意:由于函數(shù)重載是以參數(shù)類型來(lái)區(qū)分的,而前置、后置運(yùn)算又都沒(méi)有參數(shù)。為了解決這個(gè)語(yǔ)言學(xué)上的漏洞,只好讓后置式運(yùn)算符有一個(gè)int類型的參數(shù)(調(diào)用時(shí),編譯器會(huì)默默地為這個(gè)int型參數(shù)指定0值)
* @return 返回一個(gè)const類型的對(duì)象
*/
const MyInt operator++(int){
MyInt oldValue = *this; //取出當(dāng)前對(duì)象
++(*this); //累加(調(diào)用上面的前置++的重載函數(shù))
return oldValue; //返回先前被取出的值
}
/**
* 重載運(yùn)算符+=,方便賦值操作:*this += 1;
*/
MyInt& operator+=(int value){
this->value = this->value + value;
return *this;
}
//MyInt &operator--(); //前置式--的實(shí)現(xiàn)與上面類似
//MyInt UPInt operator--(); //后置式--的實(shí)現(xiàn)與上面類似
};
有了上面的代碼,我們?cè)賮?lái)看main函數(shù)里的調(diào)用:
#include <.......>
#include "MyInt.h"
int main()
{
MyInt i = 0; //調(diào)用帶參構(gòu)造
++i; //調(diào)用 i.operator++() i的值為1
i++; //調(diào)用 i.operator++(0) i的值為2
return 0;
}
從上面的結(jié)果看,都是實(shí)現(xiàn)了值的自增1
回到開始的問(wèn)題:(使用我們模擬實(shí)現(xiàn)的類)
int main()
{
MyInt i = 0;
i = i++;
//問(wèn)如果打印i的值,結(jié)果是多少?
return 0;
}
首先會(huì)調(diào)用i++,即 i.operator++(0),函數(shù)代碼如下:
/**
* 重寫后置式++運(yùn)算符(i++時(shí)會(huì)自動(dòng)調(diào)用本函數(shù))
* @return 返回一個(gè)const類型的對(duì)象
*/
const MyInt operator++(int){
MyInt oldValue = *this; //注意:oldValue是*this的副本,不是引用
++(*this); //這里累加的是*this對(duì)象,而不是oldValue
return oldValue; //返回的oldValue值并沒(méi)有變化,仍然是初值
}
所以,i.operater++(0)執(zhí)行后,表達(dá)式就成了:i = 0,即
void main()
{
//1、i = i++;
//2、i.operator+=(i.operator++(0));
//3、i.operator+=(0) -> i += 0
//4、i = 0
}
i = i++ 運(yùn)行的結(jié)果就為0。
-END-
推薦閱讀
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!