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

二、重載語法(成員函數(shù)方式,推薦)
- 前置遞增重載
// 類內(nèi)聲明
類名& operator++();
// 類外定義
類名& 類名::operator++() {
// 1. 修改對象內(nèi)部狀態(tài)(如數(shù)值+1)
// 2. 返回自身引用(*this)
return *this;
}
- 后置遞增重載
// 類內(nèi)聲明(int是占位符,無實際意義,僅用于區(qū)分前置)
類名 operator++(int);
// 類外定義
類名 類名::operator++(int) {
// 1. 保存當前對象的副本(臨時對象)
類名 temp = *this;
// 2. 修改原對象狀態(tài)
// 3. 返回副本(原狀態(tài))
return temp;
}
三、基礎示例:整數(shù)包裝類重載 ++
以自定義整數(shù)類 MyInt 為例,實現(xiàn)前置 / 后置遞增:
#include <iostream>
using namespace std;
class MyInt {
private:
int val; // 封裝的整數(shù)值
public:
// 構造函數(shù)
MyInt(int v = 0) : val(v) {}
// 1. 重載前置遞增(返回引用)
MyInt& operator++() {
val++; // 先加1
return *this; // 返回自身,支持鏈式操作
}
// 2. 重載后置遞增(int占位符,返回值)
MyInt operator++(int) {
MyInt temp = *this; // 保存當前值
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
// 前置支持鏈式操作
MyInt b(10);
cout << "++(++b) = " << ++(++b) << endl; // 輸出:++(++b) = 12
return 0;
}
四、進階示例:復數(shù)類遞增(實部 + 虛部同時 + 1)
#include <iostream>
using namespace std;
class Complex {
private:
double real; // 實部
double imag; // 虛部
public:
Complex(double r = 0, double i = 0) : real(r), imag(i) {}
// 前置遞增:實部、虛部都+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ù)(需訪問私有成員時聲明為友元),語法如下:
#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;
}
六、常見誤區(qū)與注意事項
1、后置遞增的 int 占位符:
這個 int 只是語法標記,無實際參數(shù)傳遞,不能省略(否則編譯器無法區(qū)分前置 / 后置);
無需給 int 命名(如 operator++(int) 即可,不用寫 operator++(int flag))。
2、返回值錯誤:
前置遞增必須返回引用(MyInt&):若返回值,會生成臨時對象,鏈式操作(++(++a))會修改臨時對象,而非原對象;
后置遞增必須返回值(MyInt):若返回引用,會返回臨時對象的引用(臨時對象銷毀后,引用懸空,導致未定義行為)。
3、修改原對象的語義:
遞增運算符的核心是 “修改對象自身”,因此優(yōu)先重載為成員函數(shù)(全局函數(shù)需傳引用,語義不如成員函數(shù)直觀)。
與 += 配合:若類已有 += 重載,可復用邏輯:
MyInt& operator++() {
*this += 1; // 復用 += 邏輯
return *this;
}
七、遞減運算符(–)重載
遞減運算符(–)的重載邏輯與遞增完全一致,僅需將 “+1” 改為 “-1”:
// 前置遞減
MyInt& operator--() {
val--;
return *this;
}
// 后置遞減
MyInt operator--(int) {
MyInt temp = *this;
val--;
return temp;
}
總結
遞增運算符重載分前置和后置,核心區(qū)別是返回值類型和執(zhí)行順序;
優(yōu)先重載為成員函數(shù),前置返回引用(支持鏈式),后置返回值(帶 int 占位符);
遵循 “前置先改后返,后置先返后改” 的語義,符合用戶對 ++ 的直覺;
遞減運算符重載邏輯與遞增完全一致,僅修改數(shù)值操作。
到此這篇關于C++中遞增運算符重載的實現(xiàn)示例的文章就介紹到這了,更多相關C++ 遞增運算符重載內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C++利用數(shù)組(一維/二維)處理批量數(shù)據(jù)的方法
對于簡單的問題,使用簡單的數(shù)據(jù)類型就可以了,但是對于有些需要處理的數(shù)據(jù),只用以上簡單的數(shù)據(jù)類型是不夠的,難以反映出數(shù)據(jù)的特點,也難以有效的進行處理,本文小編給大家介紹了C++利用數(shù)組(一維/二維)處理批量數(shù)據(jù)的方法,需要的朋友可以參考下2023-10-10

