c++ 重载 重写_关于C/C++中的++i和i++实现机制的探讨
生活随笔
收集整理的這篇文章主要介紹了
c++ 重载 重写_关于C/C++中的++i和i++实现机制的探讨
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最近遇到了一個比較有意思的代碼:int main()
{
int i = 0;
i = i++;
//問如果打印i的值,結果是多少?
return 0;
}
public:
int value; //實際的value值
MyInt(int value){ //方便初始化:MyInt i = 0;
this->value = value;
}
/**
* 重寫前置式++運算符(++i時會自動調用本函數)
* @return 前置式運算會返回當前對象的引用
*/
MyInt& operator++(){
*this += 1; //累加后取出
return *this;
}
/**
* 重寫后置式++運算符(i++時會自動調用本函數)
* 注意:由于函數重載是以參數類型來區分的,而前置、后置運算又都沒有參數。為了解決這個語言學上的漏洞,只好讓后置式運算符有一個int類型的參數(調用時,編譯器會默默地為這個int型參數指定0值)
* @return 返回一個const類型的對象
*/
const MyInt operator++(int){
MyInt oldValue = *this; //取出當前對象
++(*this); //累加(調用上面的前置++的重載函數)
return oldValue; //返回先前被取出的值
}
/**
* 重載運算符+=,方便賦值操作:*this += 1;
*/
MyInt& operator+=(int value){
this->value = this->value + value;
return *this;
}
//MyInt &operator--(); //前置式--的實現與上面類似
//MyInt UPInt operator--(); //后置式--的實現與上面類似
};
#include "MyInt.h"
int main()
{
MyInt i = 0; //調用帶參構造
++i; //調用 i.operator++() i的值為1
i++; //調用 i.operator++(0) i的值為2
return 0;
}
{
MyInt i = 0;
i = i++;
//問如果打印i的值,結果是多少?
return 0;
}
* 重寫后置式++運算符(i++時會自動調用本函數)
* @return 返回一個const類型的對象
*/
const MyInt operator++(int){
MyInt oldValue = *this; //注意:oldValue是*this的副本,不是引用
++(*this); //這里累加的是*this對象,而不是oldValue
return oldValue; //返回的oldValue值并沒有變化,仍然是初值
}
{
//1、i = i++;
//2、i.operator+=(i.operator++(0));
//3、i.operator+=(0) -> i += 0
//4、i = 0
}
{
int i = 0;
i = i++;
//問如果打印i的值,結果是多少?
return 0;
}
這個問題實際上涉及到了前置及后置操作符的內部實現問題。
下面我們通過模仿前置和后置操作符的實現方式,來加深對前置、后置操作符實現原理的理解:
首先,我們使用類MyInt來模擬整型:
class MyInt{public:
int value; //實際的value值
MyInt(int value){ //方便初始化:MyInt i = 0;
this->value = value;
}
/**
* 重寫前置式++運算符(++i時會自動調用本函數)
* @return 前置式運算會返回當前對象的引用
*/
MyInt& operator++(){
*this += 1; //累加后取出
return *this;
}
/**
* 重寫后置式++運算符(i++時會自動調用本函數)
* 注意:由于函數重載是以參數類型來區分的,而前置、后置運算又都沒有參數。為了解決這個語言學上的漏洞,只好讓后置式運算符有一個int類型的參數(調用時,編譯器會默默地為這個int型參數指定0值)
* @return 返回一個const類型的對象
*/
const MyInt operator++(int){
MyInt oldValue = *this; //取出當前對象
++(*this); //累加(調用上面的前置++的重載函數)
return oldValue; //返回先前被取出的值
}
/**
* 重載運算符+=,方便賦值操作:*this += 1;
*/
MyInt& operator+=(int value){
this->value = this->value + value;
return *this;
}
//MyInt &operator--(); //前置式--的實現與上面類似
//MyInt UPInt operator--(); //后置式--的實現與上面類似
};
有了上面的代碼,我們再來看main函數里的調用:
#include <.......>#include "MyInt.h"
int main()
{
MyInt i = 0; //調用帶參構造
++i; //調用 i.operator++() i的值為1
i++; //調用 i.operator++(0) i的值為2
return 0;
}
從上面的結果看,都是實現了值的自增1
回到開始的問題:(使用我們模擬實現的類)
{
MyInt i = 0;
i = i++;
//問如果打印i的值,結果是多少?
return 0;
}
首先會調用i++,即 i.operator++(0),函數代碼如下:
/*** 重寫后置式++運算符(i++時會自動調用本函數)
* @return 返回一個const類型的對象
*/
const MyInt operator++(int){
MyInt oldValue = *this; //注意:oldValue是*this的副本,不是引用
++(*this); //這里累加的是*this對象,而不是oldValue
return oldValue; //返回的oldValue值并沒有變化,仍然是初值
}
所以,i.operater++(0)執行后,表達式就成了:i = 0,即
void main(){
//1、i = i++;
//2、i.operator+=(i.operator++(0));
//3、i.operator+=(0) -> i += 0
//4、i = 0
}
i = i++ 運行的結果就為0。
-END-
推薦閱讀
【01】TIOBE 8 月編程語言:C、Java 差距拉大,R 語言盛行【02】單片機C語言,必知的數據存儲與程序編寫知識!【03】C語言之父:因拒付論文裝訂費錯失博士學位,論文52年后重見天日【04】C語言開發單片機為啥都是全局變量形式?【05】分享10個值得關注的C語言開源項目免責聲明:整理文章為傳播相關技術,版權歸原作者所有,如有侵權,請聯系刪除總結
以上是生活随笔為你收集整理的c++ 重载 重写_关于C/C++中的++i和i++实现机制的探讨的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 乐高创意机器人moc_乐高变形金刚爵士方
- 下一篇: c++输入了后边不继续_医疗:连涨多日,