1. 程式人生 > 其它 >C++遞增運算子過載,另附cout輸出流順序

C++遞增運算子過載,另附cout輸出流順序

技術標籤:C++面向物件

遞增運算子++
先看一下它的內建運算原理

int a=10;
cout<<++a<<endl//結果11
cout<<a<<endl//11
int b=10;
cout<<b++<<endl;//10
cout<<b<<endl;//11

先建立一個類

class MyInteger{
public:
	MyInteger(){
	m_Num=0;
	}
	private:
	 int m_Num;
}

分為兩部分
前置遞增和後置遞增

前置遞增

#include<iostream>
#include<string> using namespace std; //通過全域性函式過載 class MyInteger { friend ostream&operator<<(ostream &cout, MyInteger&m); public: MyInteger() { m_Num = 0; } //過載前置++運算子 MyInteger& operator++() { m_Num++; return *this; } //為什麼要返回引用,為了一直對一個數據進行遞增操作 //如果是去掉引用,相當於重新建立了另一個一樣的物件,並對其進行操作。那麼你
//每使用一次這個物件變數的值不是連續遞增操作的值。 //而且,去了引用也會不報錯 //還需要過載左移運算子 ostream&operator<<(ostream &cout, MyInteger&m) { cout << m.m_Num; return cout; } void test01() { MyInteger myint; cout << ++myint<< endl; } int main() { test01(); return 0; }

後置遞增

#include<iostream>
#include<string> using namespace std; //通過全域性函式過載 class MyInteger { friend ostream&operator<<(ostream &cout, MyInteger m); public: MyInteger() { m_Num = 0; } //過載前置++運算子 MyInteger &operator++() {//為什麼要返回引用,為了一直對一個數據進行遞增操作 //如果是去掉引用,相當於重新建立了另一個一樣的物件,並對其進行操作。那麼你 //每使用一次這個物件變數的值不是連續遞增操作的值。 m_Num++; return *this; } //過載後置++運算子 //int代表佔位引數,可以用於區別前置和後置遞增 MyInteger operator++(int) {//後置必須返回值,不能返回引用,因為你return 後面返回的是區域性變數 //先記錄當時結果 MyInteger temp = *this; //後遞增 m_Num++; //返回記錄結果 return temp; } private: int m_Num; }; //還需要過載左移運算子 ostream & operator<<(ostream &cout, MyInteger m) { cout << m.m_Num; return cout; } void test01() { MyInteger myint; //cout << myint << endl << myint++ << endl << myint << endl << myint++ << endl; cout << myint++ <<endl; cout << myint <<endl; } int main() { test01(); return 0; }

在這裡插入圖片描述

其中int的作用是佔位符,為了和前置遞增區分開來,而且只能寫int,寫double、float等都是不行的。因為沒有這個佔位引數的話,該函式與前置遞增就只有返回值不同了,而返回值是不可以作為函式過載的條件的。

新發現:
若最後結果這樣輸出,可以看到結果是
在這裡插入圖片描述
在這裡插入圖片描述
我當時很不可思議 為什麼不是 0 0 1 1 2呢
其實我最早用的示例是這個示例

void test01() {
	MyInteger myint;
	//cout << myint << endl << myint++ << endl << myint << endl << myint++ << endl;
	//cout << myint++ << endl;
	cout << myint++ << endl << myint << endl<<myint<<endl;
	cout << myint <<endl;
}

在這裡插入圖片描述
疑問,為什麼結果是這樣的呢,為什麼不應該是0 1 1 1呢
我甚至還求了這每個cout的地址,這個是一個值
還有每個myint的地址發現他們 ,發現&(myint)不一樣之外別的都是一個地址
然後,我覺得是cout函式的問題,它的輸出順序有問題
原來是它從右往左掃描然後從左往右輸出
而且還應該這麼理解,從右往左掃描之後,一旦遇到子函式,就立即計算出結果,然後結果在資料快取區的位置是與cout<<程式碼從左往右的順序相對應的,比如說最右邊的從左數是第四個,那麼結果也排在從左數第四個,也就是說計算執行順序從右往左,那麼第一個的第一個cout從右往左的執行結果在資料區的位置排序應該是2 1 1 0,(按照結果得出的順序是0 1 1 2),然後輸出為2 1 1 0 然後下一個cout的結果為2
下一個是 0 0 0 然後第二個cout輸出為1

關於cout輸出順序