C++中遞增運(yùn)算符重載的實(shí)現(xiàn)示例
在 C++ 中,遞增運(yùn)算符(++) 分為前置遞增(++obj) 和后置遞增(obj++),兩者語(yǔ)義不同,重載方式也有明顯區(qū)別。遞增運(yùn)算符是單目運(yùn)算符,通常重載為類(lèi)的成員函數(shù)(更符合語(yǔ)義,因?yàn)椴僮鲾?shù)是類(lèi)對(duì)象本身),也可重載為全局函數(shù)(極少用)。
一、核心區(qū)別:前置 vs 后置遞增

二、重載語(yǔ)法(成員函數(shù)方式,推薦)
- 前置遞增重載
// 類(lèi)內(nèi)聲明
類(lèi)名& operator++();
// 類(lèi)外定義
類(lèi)名& 類(lèi)名::operator++() {
// 1. 修改對(duì)象內(nèi)部狀態(tài)(如數(shù)值+1)
// 2. 返回自身引用(*this)
return *this;
}
- 后置遞增重載
// 類(lèi)內(nèi)聲明(int是占位符,無(wú)實(shí)際意義,僅用于區(qū)分前置)
類(lèi)名 operator++(int);
// 類(lèi)外定義
類(lèi)名 類(lèi)名::operator++(int) {
// 1. 保存當(dāng)前對(duì)象的副本(臨時(shí)對(duì)象)
類(lèi)名 temp = *this;
// 2. 修改原對(duì)象狀態(tài)
// 3. 返回副本(原狀態(tài))
return temp;
}
三、基礎(chǔ)示例:整數(shù)包裝類(lèi)重載 ++
以自定義整數(shù)類(lèi) MyInt 為例,實(shí)現(xiàn)前置 / 后置遞增:
#include <iostream>
using namespace std;
class MyInt {
private:
int val; // 封裝的整數(shù)值
public:
// 構(gòu)造函數(shù)
MyInt(int v = 0) : val(v) {}
// 1. 重載前置遞增(返回引用)
MyInt& operator++() {
val++; // 先加1
return *this; // 返回自身,支持鏈?zhǔn)讲僮?
}
// 2. 重載后置遞增(int占位符,返回值)
MyInt operator++(int) {
MyInt temp = *this; // 保存當(dāng)前值
val++; // 后加1
return temp; // 返回原狀態(tài)
}
// 輔助:輸出重載(方便打?。?
friend ostream& operator<<(ostream& os, const MyInt& mi) {
os << mi.val;
return os;
}
};
int main() {
MyInt a(5);
// 前置遞增:先加1,再使用
cout << "++a = " << ++a << endl; // 輸出:++a = 6
cout << "a = " << a << endl; // 輸出:a = 6
// 后置遞增:先使用,再加1
cout << "a++ = " << a++ << endl; // 輸出:a++ = 6
cout << "a = " << a << endl; // 輸出:a = 7
// 前置支持鏈?zhǔn)讲僮?
MyInt b(10);
cout << "++(++b) = " << ++(++b) << endl; // 輸出:++(++b) = 12
return 0;
}
四、進(jìn)階示例:復(fù)數(shù)類(lèi)遞增(實(shí)部 + 虛部同時(shí) + 1)
#include <iostream>
using namespace std;
class Complex {
private:
double real; // 實(shí)部
double imag; // 虛部
public:
Complex(double r = 0, double i = 0) : real(r), imag(i) {}
// 前置遞增:實(shí)部、虛部都+1,返回引用
Complex& operator++() {
real++;
imag++;
return *this;
}
// 后置遞增:返回原狀態(tài),再修改
Complex operator++(int) {
Complex temp = *this;
real++;
imag++;
return temp;
}
// 輸出重載
friend ostream& operator<<(ostream& os, const Complex& c) {
os << real << " + " << imag << "i";
return os;
}
};
int main() {
Complex c(1.5, 2.5);
cout << "++c = " << ++c << endl; // 輸出:++c = 2.5 + 3.5i
cout << "c++ = " << c++ << endl; // 輸出:c++ = 2.5 + 3.5i
cout << "c = " << c << endl; // 輸出:c = 3.5 + 4.5i
return 0;
}
五、全局函數(shù)重載(極少用,了解即可)
若需重載為全局函數(shù)(需訪(fǎng)問(wèn)私有成員時(shí)聲明為友元),語(yǔ)法如下:
#include <iostream>
using namespace std;
class MyInt {
private:
int val;
public:
MyInt(int v = 0) : val(v) {}
// 聲明友元:前置遞增
friend MyInt& operator++(MyInt& mi);
// 聲明友元:后置遞增
friend MyInt operator++(MyInt& mi, int);
friend ostream& operator<<(ostream& os, const MyInt& mi) {
os << mi.val;
return os;
}
};
// 全局定義前置遞增
MyInt& operator++(MyInt& mi) {
mi.val++;
return mi;
}
// 全局定義后置遞增
MyInt operator++(MyInt& mi, int) {
MyInt temp = mi;
mi.val++;
return temp;
}
int main() {
MyInt a(5);
cout << ++a << endl; // 6
cout << a++ << endl; // 6
cout << a << endl; // 7
return 0;
}
六、常見(jiàn)誤區(qū)與注意事項(xiàng)
1、后置遞增的 int 占位符:
這個(gè) int 只是語(yǔ)法標(biāo)記,無(wú)實(shí)際參數(shù)傳遞,不能省略(否則編譯器無(wú)法區(qū)分前置 / 后置);
無(wú)需給 int 命名(如 operator++(int) 即可,不用寫(xiě) operator++(int flag))。
2、返回值錯(cuò)誤:
前置遞增必須返回引用(MyInt&):若返回值,會(huì)生成臨時(shí)對(duì)象,鏈?zhǔn)讲僮鳎?+(++a))會(huì)修改臨時(shí)對(duì)象,而非原對(duì)象;
后置遞增必須返回值(MyInt):若返回引用,會(huì)返回臨時(shí)對(duì)象的引用(臨時(shí)對(duì)象銷(xiāo)毀后,引用懸空,導(dǎo)致未定義行為)。
3、修改原對(duì)象的語(yǔ)義:
遞增運(yùn)算符的核心是 “修改對(duì)象自身”,因此優(yōu)先重載為成員函數(shù)(全局函數(shù)需傳引用,語(yǔ)義不如成員函數(shù)直觀(guān))。
與 += 配合:若類(lèi)已有 += 重載,可復(fù)用邏輯:
MyInt& operator++() {
*this += 1; // 復(fù)用 += 邏輯
return *this;
}
七、遞減運(yùn)算符(–)重載
遞減運(yùn)算符(–)的重載邏輯與遞增完全一致,僅需將 “+1” 改為 “-1”:
// 前置遞減
MyInt& operator--() {
val--;
return *this;
}
// 后置遞減
MyInt operator--(int) {
MyInt temp = *this;
val--;
return temp;
}
總結(jié)
遞增運(yùn)算符重載分前置和后置,核心區(qū)別是返回值類(lèi)型和執(zhí)行順序;
優(yōu)先重載為成員函數(shù),前置返回引用(支持鏈?zhǔn)剑?,后置返回值(?int 占位符);
遵循 “前置先改后返,后置先返后改” 的語(yǔ)義,符合用戶(hù)對(duì) ++ 的直覺(jué);
遞減運(yùn)算符重載邏輯與遞增完全一致,僅修改數(shù)值操作。
到此這篇關(guān)于C++中遞增運(yùn)算符重載的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)C++ 遞增運(yùn)算符重載內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++結(jié)構(gòu)體作為函數(shù)參數(shù)傳參的實(shí)例代碼
這篇文章主要介紹了C++結(jié)構(gòu)體作為函數(shù)參數(shù)傳參的實(shí)例代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12
基于OpenCV實(shí)現(xiàn)的人臉簽到系統(tǒng)源代碼
本文從實(shí)際背景和需求出發(fā),采用人臉識(shí)別簽到考勤改變了傳統(tǒng)人工檢驗(yàn)的做法,極大提高了組織效率和辦事能力,這篇文章主要給大家介紹了關(guān)于如何基于OpenCV實(shí)現(xiàn)的人臉簽到系統(tǒng)的相關(guān)資料,需要的朋友可以參考下2024-04-04
C語(yǔ)言實(shí)現(xiàn)打印數(shù)字金字塔
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)打印數(shù)字金字塔方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
C++類(lèi)與對(duì)象的詳細(xì)說(shuō)明2
這篇文章主要為大家詳細(xì)介紹了C++的類(lèi)與對(duì)象,使用數(shù)據(jù)庫(kù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-02-02
基于C語(yǔ)言實(shí)現(xiàn)學(xué)生管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了基于C語(yǔ)言實(shí)現(xiàn)學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
C++實(shí)現(xiàn)LeetCode(160.求兩個(gè)鏈表的交點(diǎn))
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(160.求兩個(gè)鏈表的交點(diǎn)),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07

