C++——運算子的過載---以成員函式方式過載---以友元函式方式過載
阿新 • • 發佈:2019-01-12
一、運算子的過載
1、運算子的過載
允許把標準運算子(如+ - * /等運算子)應用於自定義資料型別的物件,可以提高程式的可讀性,運算子的過載本質上還是函式過載。運算子僅僅是語法上的方便,它是另一種函式呼叫的方式,只有在設計涉及的程式碼更容易寫,尤其是更容易讀的時候才有必要過載。
2、實現運算子過載的方式
- 類的成員函式
- 友元函式(即類外的普通函式)
3、運算子過載的原則:
- 不能過載的運算子有5個: . .* ?: :: sizeof
- 運算子過載不允許發明新的運算子
- 不能改變運算子操作物件的個數
- 運算子被過載後其優先順序與結合性不會改變
4、友元函式與類成員函式的使用場合:
- 一般情況下,建議一元運算子使用類的成員函式,二元運算子使用友元函式
- 運算子的操作需要修改類物件的狀態,則使用成員函式。如需要做左值運算元的運算子(=,+=,*=,++,--)
- 運算時,有數與物件的混合運算時,必須使用友元函式
- 二元運算中,第一個運算元為非物件時,必須使用友元函式。如輸入輸出運算子<< >>
- 具體規則如下:
5.友元函式與類成員函式的引數與返回值
- 引數:
- 當引數不會被改變時,一般採用const引用,
- 返回值:
- 如果返回值可能出現在=左邊,則只能作為左值,返回非const引用
- 如果返回值只能出現在=右邊,則只能作為右值,返回const型值或const型引用
- 如果返回值既可能出現在=號左邊,也可能出現在=右邊,則其返回值必須為左值,返回非const引用。
二、使用函式、類成員函式、友元函式分別實現複數+運算子的過載
1、使用函式實現兩個複數相加。示例程式碼如下:
-
1 class Complex 2 { 3 public: 4 Complex()
-
這種呼叫方式太繁瑣而且不直觀
2、使用類成員函式過載運算子+實現複數運算。具體程式碼如下:
-
1 class Complex 2 { 3 public: 4 Complex() //無參建構函式 5 { 6 real = 0; 7 imag = 0; 8 } 9 Complex(double r, double i) //有參建構函式 10 { 11 real = r; 12 imag = i; 13 } 14 Complex operator + (Complex &c2); //宣告過載運算子 15 private: 16 double real; 17 double imag; 18 }; 19 20 Complex Complex::operator +(Complex &c2) 21 { 22 Complex C;//定義一個C物件是為了能夠連續使用+操作符 23 C.real = real + c2.real; 24 C.imag = imag + c2.imag; 25 return C; 26 } 27 int main() 28 { 29 Complex c1(3,4), c2(5,-10), c3; 30 c3 = c1 + c2; //運算子+ 用於複數運算 31 return 0; 32 }
-
主函式在執行c1+c2語句時,呼叫了運算子過載函式operator+()函式
- 相當於c1.operaor+(c2);
3、使用友元函式過載運算子+實現複數的相加。具體程式碼如下:
-
1 class Complex 2 { 3 public: 4 Complex() 5 { 6 real = 0; 7 imag = 0; 8 } 9 Complex(double r, double i) 10 { 11 real = r; 12 imag = i; 13 } 14 friend Complex operator + (Complex &c1, Complex &c2); //宣告過載運算子 15 private: 16 double real; 17 double imag; 18 }; 19 20 Complex operator +(Complex &c1,Complex &c2) 21 { return Complex(c1.real + c2.real, c1.imag + c2.imag);//直接呼叫複製建構函式 22 } 23 int main() 24 { 25 Complex c1(3,4), c2(5,-10), c3; 26 c3 = c1 + c2; //運算子+ 用於複數運算 27 return 0; 28 }
必須是complex的物件才可以相加。如果是實數與complex物件相加,則實數會被預設的建構函式強制轉換為虛部為0的複數進行相加。
未完待續!!!!!!!!!!!!!