1. 程式人生 > >C++——運算子的過載---以成員函式方式過載---以友元函式方式過載

C++——運算子的過載---以成員函式方式過載---以友元函式方式過載

一、運算子的過載

  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 &); 11 12 private: 13 double real; 14 double imag; 15 }; 16 17 Complex Complex :: Complex_Add(Complex &c2) 18 { 19 Complex temp; 20 temp.real = this->real + c2.real; 21 temp.imag = this->imag + c2.imag; 22 23 return temp; 24 } 25 26 int main() 27 { 28 Complex c1(3,4),c2(1.2,-4),c3; 29 c3 = c1.Complex_Add(c2); 30 return 0; 31 }
  •  這種呼叫方式太繁瑣而且不直觀


 

  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的複數進行相加。

 

 未完待續!!!!!!!!!!!!!