關(guān)于C/C++中的++i和i++實(shí)現(xiàn)機(jī)制的探討
時間:2020-08-06 01:56:37
手機(jī)看文章
掃描二維碼
隨時隨地手機(jī)看文章
[導(dǎo)讀]最近遇到了一個比較有意思的代碼: int main() { int i = 0; i = i++; //問如果打印i的值,結(jié)果是多少? return 0; } 這個問題實(shí)際上涉及到了前置及后置操作符的內(nèi)部實(shí)現(xiàn)問題。 下面我們通過模仿前置和后置操作符的實(shí)現(xiàn)方式,來加深對前置、
int main()
{
int i = 0;
i = i++;
//問如果打印i的值,結(jié)果是多少?
return 0;
}
這個問題實(shí)際上涉及到了前置及后置操作符的內(nèi)部實(shí)現(xiàn)問題。
下面我們通過模仿前置和后置操作符的實(shí)現(xiàn)方式,來加深對前置、后置操作符實(shí)現(xiàn)原理的理解:
首先,我們使用類MyInt來模擬整型:
class MyInt{
public:
int value; //實(shí)際的value值
MyInt(int value){ //方便初始化:MyInt i = 0;
this->value = value;
}
/**
* 重寫前置式++運(yùn)算符(++i時會自動調(diào)用本函數(shù))
* @return 前置式運(yùn)算會返回當(dāng)前對象的引用
*/
MyInt& operator++(){
*this += 1; //累加后取出
return *this;
}
/**
* 重寫后置式++運(yùn)算符(i++時會自動調(diào)用本函數(shù))
* 注意:由于函數(shù)重載是以參數(shù)類型來區(qū)分的,而前置、后置運(yùn)算又都沒有參數(shù)。為了解決這個語言學(xué)上的漏洞,只好讓后置式運(yùn)算符有一個int類型的參數(shù)(調(diào)用時,編譯器會默默地為這個int型參數(shù)指定0值)
* @return 返回一個const類型的對象
*/
const MyInt operator++(int){
MyInt oldValue = *this; //取出當(dāng)前對象
++(*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)與上面類似
};
有了上面的代碼,我們再來看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
回到開始的問題:(使用我們模擬實(shí)現(xiàn)的類)
int main()
{
MyInt i = 0;
i = i++;
//問如果打印i的值,結(jié)果是多少?
return 0;
}
首先會調(diào)用i++,即 i.operator++(0),函數(shù)代碼如下:
/**
* 重寫后置式++運(yùn)算符(i++時會自動調(diào)用本函數(shù))
* @return 返回一個const類型的對象
*/
const MyInt operator++(int){
MyInt oldValue = *this; //注意:oldValue是*this的副本,不是引用
++(*this); //這里累加的是*this對象,而不是oldValue
return oldValue; //返回的oldValue值并沒有變化,仍然是初值
}
所以,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)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點(diǎn),不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!