C++第05課 運算子過載
阿新 • • 發佈:2021-09-06
1.基本過載
+ 友元函式的方式實現過載
+ 類成員函式的方式實現過載
過載函式的基本語法: 過載函式的返回值型別 operator 要過載的運算子(引數){函式體;};
引數個數:
+ 友元過載 過載函式的引數個數等於運算子的運算元
+ 類成員函式過載,過載函式引數個數是等於運算子的運算元-1
class MM { //友元過載+ friend MM operator+(MM obj1, MM obj2); public: MM() {} MM(string name,int age):name(name),age(age){} //類的成員函式過載-MM operator-(MM obj); void print() { cout << name << "\t" << age << endl; } protected: string name; int age; }; MM operator+(MM obj1, MM obj2) { return MM(obj1.name + obj2.name, obj1.age + obj2.age); } MM MM::operator-(MM obj) { return MM(this->name, this->age - obj.age); } int main() { MM mm("小可愛", 14); MM mm1("小寶貝", 18); MM obj = mm + mm1; //等價於:MM obj=operator+(mm+mm1); obj.print(); //小可愛小寶貝 32 MM obj1 = mm1 - mm; //等價於:MM obj=mm1.operator-(mm); obj1.print(); //小寶貝 4 //cout << obj << endl;return 0; }
注意項:
1.習慣上,單目採用類的成員函式過載,雙目採用友元方式過載
2.一般在過載運算子的時候,儘量不要違背本意(加法就是加法,不要把加法過載減法的效果)
3.有些運算子不能過載: ?: . :: # .* ->*
4.有些運算子必須採用類成員函式過載:() [] =
5.流過載必須採用友元過載
2.特殊過載
+ ++ -- 前置和後置的一個過載
+ 後置的++ 或者-- 一定要加個int作為標記
class Num { public: Num(int num=0) :num(num) {} void print() { cout << num << endl; } //前置++ Num operator++(); //後置++ Num operator++(int); protected: int num; }; Num Num::operator++() { return Num(this->num++); } Num Num::operator++(int) { return Num(this->num++); } int main() { Num a(1); Num b = a++; b.print(); Num c = ++a; c.print(); return 0; }
+ 流運算子過載
+ 流物件: ostream : 輸出流 cout就是ostream類的物件 istream:輸入流, cin就是istream類的物件
+ 流過載 ,必須採用的引用的方式,必須採用友元的方式
class MM { //友元實現 friend ostream& operator<<(ostream& out, MM& mm); friend istream& operator>>(istream& in,MM& mm); public: MM() {} MM(string name, int age) :name(name), age(age) {} //類的成員函式實現 protected: string name; int age; }; ostream& operator<<(ostream& out, MM& mm) { out << mm.name << "\t" << mm.age; return out; } istream& operator>>(istream& in, MM& mm) { in >> mm.name >> mm.age; return in; } int main() { MM mm; cin >> mm; //cin:istream cout << mm << endl; //cout:ostream return 0; }
+ 字尾的過載(文字過載)
//字尾過載 文字過載 unsigned long long operator"" _h(unsigned long long num) { return num * 60 * 60; } int main() { int a = 1_h; cout << a << endl; //3600 return 0; }
3.隱式轉換
實現物件與其他型別的一個隱式轉換
基本語法: operator 要轉的型別() { return 返回相應型別的資料;};
//隱式轉換 class GG { public: GG() {} GG(string name, int age) :name(name), age(age) {} //基本語法: operator 要轉的型別() { return 返回相應型別的資料;}; operator int() { return this->age; } protected: string name; int age; }; int main() { GG gg("小可愛", 19); int num = gg; //自定義型別不存在賦值的直接隱式轉換,需要自己寫 cout << num << endl; return 0; }