C++運算符重載的詳細講解
加號運算符重載
對于內(nèi)置數(shù)據(jù)類型,編譯器知道如何運算
但是對于自己封裝的類,編譯器無法進行運算
這時可以通過自己定義運算符重載進行運算
operator+
通過成員函數(shù)重載+號
#include<iostream> using namespace std; class Person { public: int m_a; int m_b; //通過成員函數(shù)實現(xiàn)重載 Person operator+ (Person &p) { //創(chuàng)建一個臨時變量 Person temp; temp.m_a = this->m_a + p.m_a; temp.m_b = this->m_b + p.m_b; return temp; } }; void test01() { Person p1; p1.m_a = 66; p1.m_b = 44; Person p2; p2.m_a = 6; p2.m_b = 4; Person p3; //通過函數(shù)原型調用 p3 = p1.operator+(p2); //簡便調用 //p3 = p1 + p2; cout << "p3.m_a:" << p3.m_a << endl; cout << "p3.m_b:" << p3.m_b << endl; } int main() { test01(); system("pause"); return 0; }
注意兩種調用方式
通過函數(shù)原型調用
p3 = p1.operator+(p2);
簡便調用
p3 = p1 + p2;
通過全局函數(shù)重載+號
#include<iostream> using namespace std; class Person { public: int m_a; int m_b; }; //通過全局函數(shù)實現(xiàn)重載 Person operator+ (Person& p1, Person& p2) { //創(chuàng)建一個臨時變量 Person temp; temp.m_a = p1.m_a + p2.m_a; temp.m_b = p1.m_b + p2.m_b; return temp; } void test01() { Person p1; p1.m_a = 66; p1.m_b = 44; Person p2; p2.m_a = 6; p2.m_b = 4; Person p3; //函數(shù)原型調用 p3 = operator+(p1,p2); //簡便調用 //p3 = p1 + p2; cout << "p3.m_a:" << p3.m_a << endl; cout << "p3.m_b:" << p3.m_b << endl; } int main() { test01(); system("pause"); return 0; }
注意兩種調用方式
通過函數(shù)原型調用
p3 = operator+(p1,p2);
簡便調用
p3 = p1 + p2;
運算符重載發(fā)生函數(shù)重載
運算符重載可以發(fā)生函數(shù)重載:Person+int等等
#include<iostream> using namespace std; class Person { public: int m_a; int m_b; }; //通過全局函數(shù)實現(xiàn)重載 Person operator+ (Person& p1, int num) { //創(chuàng)建一個臨時變量 Person temp; temp.m_a = p1.m_a + num; temp.m_b = p1.m_b + num; return temp; } void test01() { Person p1; p1.m_a = 66; p1.m_b = 44; Person p2; p2.m_a = 6; p2.m_b = 4; Person p3; //函數(shù)原型調用 //p3 = operator+(p1,55); //簡便調用 p3 = p1 + 55; cout << "p3.m_a:" << p3.m_a << endl; cout << "p3.m_b:" << p3.m_b << endl; } int main() { test01(); system("pause"); return 0; }
調用方法和定義方法與上面相同,不再多余贅述
總結
1、系統(tǒng)內(nèi)置數(shù)據(jù)類型的表達式不可改變
2、不要濫用運算符重載
左移運算符
不利用成員函數(shù)重載左移運算符
沒有具體演示,因為報錯,我也沒寫出來
下面通過全局函數(shù)實現(xiàn)
#include<iostream> using namespace std; class Person { public: int m_a; int m_b; }; ostream& operator<<(ostream& cout,Person&p) { cout << "p.m_a=" <<p. m_a << " p.m_b=" <<p. m_b << endl; return cout; } void test01() { Person p1; p1.m_a = 44; p1.m_b = 66; cout << p1 << endl; } int main() { test01(); system("pause"); return 0; }
因為要實現(xiàn)鏈式,實現(xiàn)追加,所以返回值必須是ostream
總結
配合友元實現(xiàn)自定義輸出類型
遞增運算符重載
遞增運算符重載
#include<iostream> using namespace std; class myInt { friend ostream& operator<<(ostream& cout, myInt num); public: myInt() { this->m_a = 0; } //前置++運算符重載 myInt& operator++()//返回引用是為了一直對一個數(shù)據(jù)進行遞增,否則函數(shù)默認返回一個新的數(shù) { //先進行++ m_a++; //然后返回自身 return *this; } //后置++運算符重載 myInt operator++(int)//int表示占位參數(shù),用于區(qū)分前置后置參數(shù) { //先記錄當前的值 myInt temp=*this; //再遞增 m_a++; //然后返回記錄的值 return temp; } private: int m_a; }; //左移運算符重載 ostream& operator<<(ostream& cout, myInt num) { cout << num.m_a; return cout; } void test01() { myInt myint; cout << myint << endl; cout << ++myint << endl; cout << myint << endl; } int main() { test01(); system("pause"); return 0; }
賦值運算符重載
#include<iostream> using namespace std; class Person { public: Person(int num)//將數(shù)據(jù)開辟到堆區(qū) { m_a = new int(num); } ~Person() { if (m_a != NULL) { delete m_a; m_a = NULL; } } //重載賦值運算符 Person& operator=(Person &p)//返回值用Person返回本身,可執(zhí)行連等 { //先判斷是否有屬性在堆區(qū),如果有先釋放干凈 if (m_a != NULL) { delete m_a; m_a = NULL; } m_a = new int(*p.m_a); return *this; } int* m_a; }; void test01() { Person p1(18); Person p2(209); Person p3(9); p2 = p1 = p3; cout << *p1.m_a << endl; cout << *p2.m_a << endl; cout << *p3.m_a << endl; } int main() { test01(); system("pause"); return 0; }
關系運算符重載
#include<iostream> using namespace std; #include<string> class Person { public: Person(string name, int age) { this->age = age; this->name = name; } bool operator==(Person& p) { if (this->age == p.age && this->name == p.name) { return true; } else { return false; } } bool operator!=(Person& p) { if (this->age == p.age && this->name == p.name) { return false; } else { return true; } } string name; int age; }; void test01() { Person p1("gouride", 19); Person p2("gouride", 19); if (p1 == p2) { cout << "p1和p2相同" << endl; } else { cout << "p1和p2不相同" << endl; } if (p1 != p2) { cout << "p1和p2不相同" << endl; } else { cout << "p1和p2相同" << endl; } } int main() { test01(); system("pause"); return 0; }
函數(shù)調用重載
仿函數(shù)
#include<iostream> using namespace std; #include<string> class Myprint { public: void operator()(string name) { cout << name << endl; } int operator()(int a,int b) { return a + b; } }; void test01() { Myprint myprint; myprint("測試"); //匿名對象調用 cout << Myprint()(4,6) << endl; } int main() { test01(); system("pause"); return 0; }
總結
到此這篇關于C++運算符重載的文章就介紹到這了,更多相關C++運算符重載內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
VSCode (Visual Studio Code) V1.43.0下載并設置成中文語言的方法
Visual Studio Code是一款免費開源的現(xiàn)代化輕量級代碼編輯器,支持語法高亮、智能代碼補全、自定義熱鍵、括號匹配、代碼片段、代碼對比 Diff、GIT 等特性,這篇文章主要介紹了VSCode (Visual Studio Code) V1.43.0下載并設置成中文語言,需要的朋友可以參考下2020-03-03