C++——運算符的重載---以成員函數方式重載---以友元函數方式重載
阿新 • • 發佈:2019-01-12
復制構造函數 類成員 gin mage 普通 operator 定義 第一個 public
一、運算符的重載
1、運算符的重載
允許把標準運算符(如+ - * /等運算符)應用於自定義數據類型的對象,可以提高程序的可讀性,運算符的重載本質上還是函數重載。運算符僅僅是語法上的方便,它是另一種函數調用的方式,只有在設計涉及的代碼更容易寫,尤其是更容易讀的時候才有必要重載。
2、實現運算符重載的方式
- 類的成員函數
- 友元函數(即類外的普通函數)
3、運算符重載的原則:
- 不能重載的運算符有5個: . .* ?: :: sizeof
- 運算符重載不允許發明新的運算符
- 不能改變運算符操作對象的個數
- 運算符被重載後其優先級與結合性不會改變
4、友元函數與類成員函數的使用場合:
- 一般情況下,建議一元運算符使用類的成員函數,二元運算符使用友元函數
- 運算符的操作需要修改類對象的狀態,則使用成員函數。如需要做左值操作數的運算符(=,+=,*=,++,--)
- 運算時,有數與對象的混合運算時,必須使用友元函數
- 二元運算中,第一個操作數為非對象時,必須使用友元函數。如輸入輸出運算符<< >>
- 具體規則如下:
5.友元函數與類成員函數的參數與返回值
- 參數:
- 當參數不會被改變時,一般采用const引用,
- 返回值:
- 如果返回值可能出現在=左邊,則只能作為左值,返回非const引用
- 如果返回值只能出現在=右邊,則只能作為右值,返回const型值或const型引用
- 如果返回值既可能出現在=號左邊,也可能出現在=右邊,則其返回值必須為左值,返回非const引用。
二、使用函數、類成員函數、友元函數分別實現復數+運算符的重載
1、使用函數實現兩個復數相加。示例代碼如下:
-
1 class Complex 2 { 3 public: 4 Complex() 5 { 6 real = 0; 7 imag = 0; 8 } 9 10 Complex Complex_Add(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的復數進行相加。
未完待續!!!!!!!!!!!!!
C++——運算符的重載---以成員函數方式重載---以友元函數方式重載