C++总结笔记(七)—— 运算符重载
文章目錄
- 一、概念
- 二、程序示例
- 1. 加減乘除重載
- 2. 賦值運(yùn)算符重載
- 3. 遞增遞減運(yùn)算符重載
- 4. 關(guān)系運(yùn)算符重載
- 5. 左移運(yùn)算符重載
- 6. 函數(shù)調(diào)用運(yùn)算符重載
一、概念
C++中運(yùn)算符重載是為了實(shí)現(xiàn)對(duì)象之間進(jìn)行各種運(yùn)算的特定語法,在某些特定的場合起到重要的作用,新建重載方法需用operator關(guān)鍵字進(jìn)行修飾。
可以重載運(yùn)算符包括+、-、*、\、賦值運(yùn)算符=、左移運(yùn)算符<<、遞增運(yùn)算符++、遞減運(yùn)算符- -、關(guān)系運(yùn)算符、函數(shù)調(diào)用運(yùn)算符()等。
運(yùn)算符重載需要遵守以下規(guī)則:
1 重載時(shí)不能違法運(yùn)算符原來的句法規(guī)則。
2 只能重載C++定義的運(yùn)算符。
3 不能改變運(yùn)算符原有的優(yōu)先級(jí)。
4 運(yùn)算符的結(jié)合性不能被改變。
5 不能進(jìn)行重載的運(yùn)算符:成員運(yùn)算符(.),(::),條件運(yùn)算符,sizeof、強(qiáng)制類型轉(zhuǎn)換運(yùn)算符。
6 運(yùn)算符的目數(shù)(又稱“元數(shù)”,即運(yùn)算符所需要的操作數(shù)的數(shù)目)不能被改變。
7 當(dāng)重載“()”、“[]、“->”、=時(shí),運(yùn)算符重載函數(shù)必須被聲明為類成員。
二、程序示例
1. 加減乘除重載
#include<iostream> using namespace std;class MyFloat {//成員函數(shù)重載運(yùn)算符 public://MyFloat operator+(MyFloat& myf)//{// MyFloat temp;// temp.N1 = this->N1 + myf.N1;// temp.N2 = this->N2 + myf.N2;// return temp;//}MyFloat operator-(MyFloat& myf){MyFloat temp;temp.N1 = this->N1 - myf.N1;temp.N2 = this->N2 - myf.N2;return temp;}MyFloat operator*(MyFloat& myf){MyFloat temp;temp.N1 = this->N1 * myf.N1;temp.N2 = this->N2 * myf.N2;return temp;}MyFloat operator/(MyFloat& myf){MyFloat temp;temp.N1 = this->N1 / myf.N1;temp.N2 = this->N2 / myf.N2;return temp;}public:float N1;float N2; };//全局函數(shù)重載運(yùn)算符 MyFloat operator+(MyFloat& Myf1, MyFloat& Myf2) {MyFloat temp;temp.N1 = Myf1.N1 + Myf2.N1;temp.N2 = Myf1.N2 + Myf2.N2;return temp; }MyFloat operator+(MyFloat& Myf1, int N) {MyFloat temp;temp.N1 = Myf1.N1 + N;temp.N2 = Myf1.N2 + N;return temp; }int main() {MyFloat myf1;myf1.N1 = float(3.6);myf1.N2 = float(3.4);MyFloat myf2;myf2.N1 = float(3.6);myf2.N2 = float(3.4);/*MyFloat myf3 = myf1.operator+(myf2);*///本質(zhì)寫法/*MyFloat myf3 = operator+(myf1, myf2);*/MyFloat myf3 = myf1 + myf2;//簡化寫法MyFloat myf31 = myf1 + 1;MyFloat myf4 = myf1 - myf2;MyFloat myf5 = myf1 * myf2;MyFloat myf6 = myf1 / myf2;cout << myf3.N1 << " " << myf3.N2 << endl;cout << myf31.N1 << " " << myf31.N2 << endl;cout << myf4.N1 << " " << myf4.N2 << endl;cout << myf5.N1 << " " << myf5.N2 << endl;cout << myf6.N1 << " " << myf6.N2 << endl; } 7.2 6.8 4.6 4.4 0 0 12.96 11.56 1 12. 賦值運(yùn)算符重載
#include<iostream> using namespace std;class MyFloat { public:MyFloat(float n){N = new float(n);}//賦值運(yùn)算符MyFloat& operator=(MyFloat &myf){//先判斷是否有堆區(qū)的屬性if (N != NULL){delete N;N = NULL;}//深拷貝N = new float(*myf.N);return *this;}//如果不加賦值運(yùn)算符重載,對(duì)象的賦值操作會(huì)引發(fā)內(nèi)存重復(fù)釋放的異常。~MyFloat(){if (N != NULL){delete N;N = NULL;}}float *N; };int main() {MyFloat myf1(1.1415);MyFloat myf2(2.1415);MyFloat myf3(3.1415);myf3 = myf2 = myf1;cout << *myf3.N << endl;;cout << *myf2.N << endl;;}3. 遞增遞減運(yùn)算符重載
#include<iostream> using namespace std;class MyFloat {friend ostream& operator<<(ostream& cout, MyFloat myf); public:MyFloat(){N = 3.1415;}//重載前置++運(yùn)算符,返回類型為引用,是因?yàn)槿绻患?#xff0c;返回值屬于值類型,重載函數(shù)運(yùn)行完后會(huì)銷毀//運(yùn)行完后N的值始終只會(huì)加一次1,如果再調(diào)用重載,N的值不會(huì)一直加1MyFloat& operator++(){//先進(jìn)行++計(jì)算N++;return *this;}//重載后置++運(yùn)算符,int代表占位參數(shù),用于區(qū)分前置后置MyFloat& operator++(int){//先記錄當(dāng)時(shí)的結(jié)果MyFloat temp = *this;//后遞增N++;return temp;}//重載前置--運(yùn)算符MyFloat& operator--(){//先進(jìn)行--計(jì)算N--;return *this;}//重載后置--運(yùn)算符,int代表占位參數(shù),用于區(qū)分前置后置MyFloat& operator--(int){//先記錄當(dāng)時(shí)的結(jié)果MyFloat temp = *this;//后遞減N--;return temp;}private:float N; };ostream& operator<<(ostream & cout, MyFloat myf) {cout << myf.N;return cout; }int main() {//后置重載MyFloat myf;cout << myf++ << " " << endl;cout << myf << endl;cout << myf-- << " " << endl;cout << myf << endl;MyFloat myf1;cout << ++myf1 << " " << endl;cout << ++(++myf1) << " " << endl;//又調(diào)用一次++相當(dāng)于先調(diào)用了一次拷貝構(gòu)造函數(shù),然后再調(diào)用重載,拷貝構(gòu)造函數(shù)會(huì)重新創(chuàng)建一個(gè)拷貝的值的內(nèi)存,再運(yùn)行完后銷毀。//如果重載返回值類型不加&,會(huì)直接銷毀++myf1的拷貝值,加&,會(huì)創(chuàng)建一個(gè)指針常量,一直指向內(nèi)存中的N,返回值也會(huì)一直是類中的N,而不是拷貝的N的值。cout << myf1 << endl;cout << --myf1 << " " << endl;cout << myf1 << endl; } 3.1415 4.1415 4.1415 3.1415 4.1415 4.1415 3.1415 3.14154. 關(guān)系運(yùn)算符重載
#include<iostream> using namespace std;class MyFloat { public:MyFloat(float n){N = n;}//等于運(yùn)算符bool operator==(MyFloat& myf){if (this->N == myf.N){return true;}else{return false;} }//大于運(yùn)算符bool operator>(MyFloat& myf){if (this->N > myf.N){return true;}else{return false;}}float N; };int main() {MyFloat myf1(1.1415);MyFloat myf2(1.1415);MyFloat myf3(3.1415);if (myf1 == myf2){cout << "myf1與myf2相等" << endl;}if (myf3 > myf2){cout << "myf3大于myf2" << endl;} } myf1與myf2相等 myf3大于myf25. 左移運(yùn)算符重載
#include<iostream> using namespace std;class MyFloat {friend ostream& operator<<(ostream& cout, MyFloat myf); public:MyFloat(){N = 3.1415*N1;}private:float N;float N1 = float(2); };//重載左移運(yùn)算符,只能利用全局函數(shù)重載。成員函數(shù)重載時(shí)會(huì)發(fā)生cout在右側(cè)。 //ostream類只能用引用的方式聲明對(duì)象。 ostream& operator<<(ostream & cout, MyFloat myf) {cout << myf.N;return cout; }int main() {MyFloat myf;cout << myf << endl;} 6.2836. 函數(shù)調(diào)用運(yùn)算符重載
#include<iostream> using namespace std;class MyFloat { public:MyFloat(float n){N = n;}//函數(shù)調(diào)用運(yùn)算符float operator()(float n1,float n2){return n1 + n2;}float N; };int main() {MyFloat myf(0);float c = myf(float(1.1415), float(1.1415));//與函數(shù)調(diào)用相似,又稱為仿函數(shù)cout << c << endl;cout << MyFloat(0)(float(1.1415), float(1.1415)) << endl;//匿名對(duì)象}總結(jié)
以上是生活随笔為你收集整理的C++总结笔记(七)—— 运算符重载的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++总结笔记(五)——构造函数和析构函
- 下一篇: C++总结笔记(八)—— 菱形继承