c++ 操作符重載和友元


  操作符重載(operator overloading)是C++中的一種多態,C++允許用戶自定義函數名稱相同但參數列表不同的函數,這被稱為函數重載或函數多態。操作符重載函數的格式一般為:

  operator  op (參數列表);// operator是關鍵字,op 代表操作符,編譯器會自動過濾掉空格

一、重載操作符 ‘+’

  下面以重載一個向量的加法為例:

  

  操作符函數一般只有一個參數。當運算符重載為類的成員函數時,函數的參數個數比原來的操作數要少一個(后置單目運算符除外),這是因為成員函數用this指針隱式地訪問了類的一個對象,它充當了運算符函數最左邊的操作數。

  (1) 雙目運算符重載為類的成員函數時,函數只顯式說明一個參數,該形參是運算符的右操作數。

  (2) 前置單目運算符重載為類的成員函數時,不需要顯式說明參數,即函數沒有形參。

  (3) 后置單目運算符重載為類的成員函數時,函數要帶有一個整型形參。

  

  這里有一點要注意:返回值不能是引用。因為是引用,其引用的是v0的對象,而v0在函數結束時會被銷毀,所以引用將指向一個不存在的對象。而使用MyVector則是在v0被銷毀時構造它的拷貝,調用函數將得到該拷貝。

  

  在主函數中有如上兩種調用方法。不過注意在 c = a + b 表達式中a是調用對象,b是作為參數被傳入的對象。

二、重載限制

  1、重載的操作符(部分例外)不必是成員函數,但重載的操作符至少得有一個是用戶自定義的類,這是為了防止用戶為標准類型重載操作符,例如將兩個整數的加法重載為乘法之類的;

  2、使用重載操作符不能違反原來的語法,例如不能把二元操作符重載為一元操作符。同樣不能改變其優先級。

  3、不能定義新的操作符。

  4、並非所有的操作符都能被重載,下表是一些常用的能被重載的操作符:

    

  5、大多數操作符都能通過成員或非成員函數重載,但以下的操作符只能通過成員函數重載:
    

  假若我們重載了加法操作符,使得其 A + 3能正常使用,那么如果是3 + A 呢?因為重載時規定加號左邊是對象右邊是int,所以3 + A是非法的。如何解決呢?一般是使用友元。

三、友元

  友元有三種:友元類,友元函數,友元成員函數,下面先介紹友元函數。

  1、友元函數的創建: 加上friend關鍵字,注意參數的數量。注意,該原型的聲明以為着兩點:

    (1)雖然friend operator * (...)函數中聲明的,但它不是成員函數,因此不能用使用成員操作符來調用;

    (2)雖然友元函數不是成員函數,但它的訪問權限跟成員函數的相同。

    (3)友元函數的聲明放在公有段和私有段都一樣。
      

  2、友元函數的實現:

     

    實際上,可以通過下面的修改將友元函數寫成非成員函數(即不用再類定義里聲明):

  3、友元函數與成員函數的區別
   (1)成員函數有this指針,而友元函數沒有this指針;

   (2)友元函數是不能被繼承的,就像父親的朋友未必是兒子的朋友。

 

     //End.

  

 

 

 

 

 

 

 

 

 

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM