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

C++——運算符的重載---以成員函數方式重載---以友元函數方式重載

復制構造函數 類成員 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 &);
    
    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的復數進行相加。

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

C++——運算符的重載---以成員函數方式重載---以友元函數方式重載