#include "iostream"
using namespace std;
//遞增運(yùn)算符重載
//自定義整型
class MyInteger {friend ostream &operator<<(ostream &cout, MyInteger mi);
public:
MyInteger() {m_Num = 0;
}
//重置前置++運(yùn)算符 返回引用是為了對(duì)同一個(gè)數(shù)進(jìn)行操作
MyInteger &operator++() {//這里不能返回值MyInteger 必須返回MyInteger& 因?yàn)椴僮鞯男枰嵌家粋€(gè)對(duì)象,返回值就是拷貝了
//先進(jìn)行++運(yùn)算
m_Num++;
//再將自身作返回
return *this;
}
//重置后置++運(yùn)算符
private:
int m_Num;
};
//重載左移運(yùn)算符
ostream &operator<<(ostream &cout, MyInteger mi) {cout<< mi.m_Num;
return cout;
}
void test() {MyInteger mi;
cout<< ++(++mi)<< endl;//C++里面原生的前置遞增可以鏈?zhǔn)秸{(diào)用,后置遞增不可以鏈?zhǔn)秸{(diào)用
}
int main() {// test();
//C++里面原生的前置遞增可以鏈?zhǔn)秸{(diào)用,后置遞增不可以鏈?zhǔn)秸{(diào)用
int a = 0;
++(++a);
cout<< a<< endl;//輸出2
return 0;
}
2
后置遞增
C++里面后置++是不能鏈?zhǔn)秸{(diào)用的
#include "iostream"
using namespace std;
//遞增運(yùn)算符重載
//自定義整型
class MyInteger {friend ostream &operator<<(ostream &cout, MyInteger mi);
public:
MyInteger() {m_Num = 0;
}
//重置前置++運(yùn)算符 返回引用是為了對(duì)同一個(gè)數(shù)進(jìn)行操作
MyInteger &operator++() {//這里不能返回值MyInteger 必須返回MyInteger& 因?yàn)椴僮鞯男枰嵌家粋€(gè)對(duì)象,返回值就是拷貝了
//先進(jìn)行++運(yùn)算
m_Num++;
//再將自身作返回
return *this;
}
//重置后置++運(yùn)算符 ?。。。。?!之前學(xué)習(xí)的占位符終于找到用武之地了
//返回值用const修飾,他能防止一些問(wèn)題,例如: (p++)++
const MyInteger operator++(int) {//int 代表占位參數(shù),可以用于區(qū)分前置和后置遞增,這里只能是int,double等不好使
MyInteger temp = *this;
m_Num++;
return temp;
}
private:
int m_Num;
};
//重載左移運(yùn)算符
ostream &operator<<(ostream &cout, MyInteger mi) {cout<< mi.m_Num;
return cout;
}
void test() {MyInteger mi;
// cout<< ++(++mi)<< endl;
cout<< mi++<< endl;//輸出0 //返回值用const修飾,他能防止一些問(wèn)題,例如: (p++)++
cout<< mi<< endl;//輸出1
}
int main() {test();
return 0;
}
0
1
遞增運(yùn)算符分為前置遞增和后置遞增。這兩個(gè)分開(kāi)來(lái)說(shuō)吧。
前置遞增。
需要?jiǎng)?chuàng)建一個(gè)名字叫做 人 的類,這個(gè)類中有一個(gè) 年齡 屬性,且默認(rèn)值為0,然后類外重載左移運(yùn)算符方便打印輸出。我們對(duì)人類的對(duì)象進(jìn)行遞增操作就是想讓年齡增加。如下:
#includeusing namespace std;
class Person
{public:
int age = 0;
Person& operator++()//**1**
{age += 1;
return *this;
}
};
ostream& operator<<(ostream& cout, const Person &p)
{cout<< p.age;
return cout;
}
void test1()
{Person p;
cout<< "++p = "<< ++p<< endl;
cout<< "++(++p) = "<< ++(++p)<< endl;
cout<< "p = "<< p<< endl;
}
int main()
{test1();
system("pause");
return 0;
}
第一個(gè)問(wèn)題 :返回值為什么是引用?
答案:因?yàn)榍爸眠f增運(yùn)算符可以這樣使用:++(++p)。即進(jìn)行兩次連續(xù)的遞增操作。若返回值為一個(gè)對(duì)象,則會(huì)產(chǎn)生一個(gè)匿名對(duì)象,之后++操作是對(duì)匿名獨(dú)對(duì)象進(jìn)行++操作。結(jié)果如下:
第二個(gè)問(wèn)題 :為什么這是前置遞增,不應(yīng)該是后置遞增嗎?
首先解釋一下問(wèn)題,還是舉個(gè)例子吧。
加運(yùn)算符在類內(nèi)實(shí)現(xiàn)重載的寫法:Person operator+(Person &p);
當(dāng)你調(diào)用的時(shí)候,如:p1 + p2,其本質(zhì)調(diào)用是 p1.operator+(p2); 。你會(huì)發(fā)現(xiàn),是 +號(hào)前面的對(duì)象調(diào)用函數(shù),加號(hào)后面的對(duì)象是參數(shù) 。所以,當(dāng)我們調(diào)用Person& operator++();的時(shí)候,是不是應(yīng)該寫 p1++??
答案:(個(gè)人推測(cè))可能和后置遞增有關(guān)。為了區(qū)分前置和后置。
后置遞增。
第一個(gè)問(wèn)題 :是后置遞增類內(nèi)重載的寫法遇到的問(wèn)題:
返回值和參數(shù)都是啥??想這樣寫??
Person operator++();
Person& operator++();
Person operator++(Person& p);
....
想了好久,也沒(méi)想出來(lái)該怎么寫。
答案:const Person operator++(int)
其中int的作用是占位符,為了和前置遞增區(qū)分開(kāi)來(lái),而且只能寫int,寫double、float等都是不行的。因?yàn)闆](méi)有這個(gè)占位參數(shù)的話,該函數(shù)與前置遞增就只有返回值不同了,而返回值是不可以作為函數(shù)重載的條件的。
至于返回值的為什么是Person話,而且還用const修飾,在下一個(gè)問(wèn)題中說(shuō)明。
第二個(gè)問(wèn)題 具體是怎樣實(shí)現(xiàn)的,畢竟后置遞增和前置遞增還是有區(qū)別的。
答案:
const Person operator++(int)
{Person p = *this;
age += 1;
return p;
}
首先創(chuàng)建一個(gè)臨時(shí)的對(duì)象,用來(lái)保存當(dāng)前值,因?yàn)樵摵瘮?shù)最后返回的不是遞增后的結(jié)果,而是遞增之前的值。
然后,屬性加一,完成遞增操作。
最后,返回臨時(shí)對(duì)象
注意1: 此時(shí)的temp是一個(gè)臨時(shí)對(duì)象,該函數(shù)運(yùn)行結(jié)束后就會(huì)被編譯器回收,所以我們直接返回temp的引用。我們需要進(jìn)行值返回,值返回的話會(huì)調(diào)用拷貝構(gòu)造函數(shù)重新創(chuàng)建一個(gè)對(duì)象。
注意2: 返回值用const修飾,他能防止一些問(wèn)題,例如: (p++)++ 。我們可以做一個(gè)小測(cè)試。
int p = 0;
cout<< "(p++)++ = "<< (p++)++<< endl;
cout<< "p = "<< p<< endl;
我們預(yù)想的結(jié)果可能是輸出:(p++)++ = 1 p = 2
但實(shí)際結(jié)果是這樣的:
報(bào)錯(cuò)了,原因是++需要可修改的左值。從結(jié)果我們可以知道,表達(dá)式p++的結(jié)果是不允許被修改的,所以我們后置遞增的返回值是const類型的。
那么為什么會(huì)這樣呢?
同樣舉個(gè)例子:
int p;
cout<< "p = "<< p<< endl;
cout<< "p++ = "<< p++<< endl;
cout<< "p = "<< p<< endl;
運(yùn)行結(jié)果如下:
我們輸出 p++ 的結(jié)果是0,這個(gè)0是哪里來(lái)的呢??是變量p中存儲(chǔ)的嗎??并不是,此時(shí)p中存儲(chǔ)的值已經(jīng)被改變了,這個(gè)0是產(chǎn)生的一個(gè)臨時(shí)值。這個(gè)臨時(shí)值在內(nèi)存中的位置是未知的,我們無(wú)法對(duì)其進(jìn)行修改。
所以,當(dāng)我們 (p++)++ 這樣使用后置遞增運(yùn)算符的時(shí)候,相當(dāng)于嘗試修改臨時(shí)變量的值,這是不被允許的。
所以,我們重載遞增操作符的返回值要用const來(lái)修飾。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
網(wǎng)站名稱:CPP核心編程4-重載遞增運(yùn)算符-創(chuàng)新互聯(lián)
瀏覽地址:http://aaarwkj.com/article26/dihpjg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、網(wǎng)站設(shè)計(jì)公司、網(wǎng)站收錄、品牌網(wǎng)站制作、服務(wù)器托管、網(wǎng)站維護(hù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容