C++遞增運算子過載,另附cout輸出流順序
阿新 • • 發佈:2021-02-04
技術標籤: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