運算子過載 過載的兩種方法 +
阿新 • • 發佈:2019-01-23
一、運算子過載入門技術推演
二、運算子過載的兩種方法#include<iostream> using namespace std; class Complex { public: int a; int b; public: Complex(int a = 0,int b = 0) { this->a = a; this->b = b; } void printCom() { cout<<a<<"+"<<b<<"i"<<endl; } protected: private: }; //定義 了全域性函式 Complex myAdd(Complex &c1,Complex &c2) { Complex tmp(c1.a + c2.a,c1.b + c2.b); return tmp; } //全域性函式 完成 +操作符 過載 //Complex operator+(Complex &c1,Complex &c2) //函式名 升級 Complex operator+(Complex &c1,Complex &c2) { Complex tmp(c1.a + c2.a,c1.b + c2.b); return tmp; } int main() { int a = 0; int b = 0; int c; //一、a和b是基礎資料型別 編譯器已經知道如何運算 c = a + b; //a + bi複數運算規則 Complex c1(1,2),c2(3,4); Complex c3;//二、類 也是一個數據型別 使用者自定義的資料型別,c++編譯器預設不知道如何運算的 //c3 = c1 + c2;//報錯 //三、c++編譯器應該給我們程式設計師提供一種機制。。。 //讓自定義資料型別有機會進行運算子操作====》這就是傳說的運算子過載 //四、運算子過載機制 //步驟一 // Complex c4 = myAdd(c1,c2); // c4.printCom(); //步驟二---》complex c4 = c1 + c2; //步驟二 //Complex c4 = operator+(c1,c2); //c4.printCom(); //步驟三與步驟二的效果一樣 Complex c4 =c1 + c2;//不再報錯了 c4.printCom(); /*總結: 1:運算子過載 本質 是一個函式呼叫*/ system("pause"); return 0; }
#include<iostream> using namespace std; class Complex { public: int a; int b; public: Complex(int a = 0,int b = 0) { this->a = a; this->b = b; } void printCom() { cout<<a<<"+"<<b<<"i"<<endl; } //2:成員函式方法 實現 - 運算子過載 Complex operator-(Complex &c2) { Complex tmp(1,2); return tmp; } protected: private: }; //1:全域性函式法 實現 + 運算子過載 Complex operator+(Complex &c1,Complex &c2) { Complex tmp(c1.a + c2.a ,c1.b + c2.b); return tmp; } int main() { /* 定義運算子過載函式名的步驟 全域性函式、類成員函式方法實現運算子過載步驟 1)要承認操作符過載是一個函式,寫出函式名稱operator+ () 2)根據運算元,寫出函式引數 3)根據業務,完善函式返回值(看函式是返回引用 還是指標 元素),及實現函式業務 */ Complex c1(1,2),c2(3,4); //1:全域性函式法 實現 + 運算子過載 //Complex operator+(Complex &c1,Complex &c2) Complex c3 = c1 + c2; c3.printCom(); //2:成員函式方法 實現 - 運算子過載 //c1.operator-(this,c2); //Complex operator+(Complex &c2); system("pause"); return 0; }
三、運算子過載的升級--使用友元函式 + 前置後置運算子過載
自增自減運算子
(1)字首形式
前置形式 返回 改變後的物件,在成員運算子函式中返回 *this ;在全域性運算函式中 返回 修改後的引數
(2)字尾形式
字尾形式 返回 改變之前的值,需要建立一個物件代表這個值的獨立物件並返回它,因此後綴運算是通過傳值方式返回的。
TV
概括來講:前置返回物件引用,後置先建立物件後返回舊值
#include<iostream> using namespace std; class Complex { private://此處升級版 int a; int b; //全域性函式 過載+運算子 friend Complex operator+(Complex &c1,Complex &c2); //過載前置 ++ 運算子 ----友元函式 friend Complex& operator++(Complex &c1); public: Complex(int a = 0,int b = 0) { this->a = a; this->b = b; } void printCom() { cout<<a<<"+"<<b<<"i"<<endl; } //2:成員函式方法 實現 - 運算子過載 Complex operator-(Complex &c2) { Complex tmp(this->a - c2.a,this->b - c2.b); return tmp; } //2:成員函式方法 實現 -- 運算子過載 Complex& operator--() { this->a--; this->b--; return *this; } protected: private: }; //1:全域性函式法 實現 + 運算子過載 Complex operator+(Complex &c1,Complex &c2) { Complex tmp(c1.a + c2.a ,c1.b + c2.b); return tmp; } //前置++ Complex& operator++(Complex &c1) { c1.a++; c1.b++; return c1; } //後置++ ====== 函式的返回值不是函式過載的標準 Complex operator++(Complex &c1,int)//新的語法佔位符 { Complex tmp(0,0); return tmp; } int main() { /* 定義運算子過載函式名的步驟 全域性函式、類成員函式方法實現運算子過載步驟 1)要承認操作符過載是一個函式,寫出函式名稱operator+ () 2)根據運算元,寫出函式引數 3)根據業務,完善函式返回值(看函式是返回引用 還是指標 元素),及實現函式業務 */ Complex c1(1,2),c2(3,4); //1:全域性函式法 實現 + 運算子過載 //Complex operator+(Complex &c1,Complex &c2) Complex c3 = c1 + c2; c3.printCom(); //2:成員函式方法 實現 - 運算子過載 //c1.operator-(this,c2); //Complex operator+(Complex &c2); Complex c4 = c1 - c2; c4.printCom(); //前置++操作符 用全域性函式實現 //Complex& operator++(Complex &c1); ++c1; c1.printCom(); //前置--操作符 用成員函式實現 //Complex& operator--(); --c1; c1.printCom(); //後置++操作符 用全域性函式實現 //Complex operator++(Complex &c1);//返回元素--與前置++不一樣 c1++; c1.printCom(); system("pause"); return 0; };