從運算符重載深入理解自增自減運算符

在學習C++的過程中經常會遇到一些自增運算符的問題,比如

1.後綴自增運算不能賦值

int tmp = 0;
tmp++ = 10;//error 不能做左值

以過往經驗來看該語句意爲對自增後的 tmp進行賦值,但爲什麼 tmp++後會變成右值呢?本文將通過自定義實現 int來理解使用自增運算符過程中出現的問題 。

class CInt
{
public:
	CInt(int val = 0)
	{
		data = val;
	}
	CInt& operator ++()//++CInt
	{
		++data;
		return *this;
	}
	const CInt operator ++(int t)//CInt++
	{
		const CInt val = *this;
		++*this;
		return val;
	}
	/*
	operator int()//實現類型轉換的語句
	{
		return data;
	}
	*/
private:
	int data;
};
前置++與後置++的內部實現不同,前置++實現自增後,返回引用後置++先保存當前對象的副本,實現自增操作後,返回副本。

前置++

CInt& operator ++()//前置++
{
	++data;
	return *this;
}
參數:      void

返回值:  引用(CInt&),返回當前對象要使用引用,如果返回類型爲CInt,返回的對象爲臨時量。

CInt a ;//a.data = 0
++(++a);//a.data = 1, ++a 返回臨時量

後置++

const CInt operator ++(int t)//後置++
{
	const CInt val = *this;
	++*this;
	return val;
}

參數 :  int,爲與區分前置++,後置++接受一個整形的形參,一般編譯器將會把0作爲實參; 


返回值:與內置類型保持一致,內置類型臨時變量不能做左值,返回類型const CInt。

在計算效果相同的情況下,前置++效率更高,後置++會產生臨時量,調用了一次構造和析構函數。


2.在vs中進行四則運算時,前綴自增優先級最高,後綴自增運算最低。

int b = 3;
int c = (b++)+(b++)+(++b);//??c = 12

分析VS產生的彙編代碼:


分析一下重點代碼可以發現,先進行前綴自增運算,再進行加法運算結果寫入c中,即c=4+4+4 ,然後進行後綴自增運算。


3.printf 函數中,前綴自增運算用一個寄存器存放 i的值,最終返回爲 i的值,後綴自增運算返回當前 i的值。

int i = 0;
printf("%d,%d,%d",i++,++i,i++);//?? 2 3 0
 

printf函數從右向左一次運算,最右邊的i++返回當前i(0)的值,在進行++運算,再中間的++i運算後,然後最左邊的 i++返回當前i(2)的值,在進行++運算,最後把 i(3)的值返回給中間的++i。



c++ 前置++與後置++的區別 - 語行 - 博客園

關於C語言前置++和後置++的二三事_luv8818_4BB_新浪博客

C++_運算符重載 總結 - ArrowToMe - 博客園

(轉)前置++和後置++的區別 - balingybj - 博客園

前置(後置)++ /--與+/-在不同編譯器下運算方式不同 - CSDN博客

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章