天天看點

友元函數,内聯函數

目錄

​​友元函數​​

​​為什麼要引入友元函數:​​

​​什麼時候使用友元函數:​​

​​怎麼使用友元函數:​​

​​友元函數的分類:​​

​​代碼如下:​​

​​内聯函數:​​

​​為什麼要使用内聯函數​​

​​内斂函數定義格式​​

​​内聯函數注意事項:​​

​​代碼展示:​​

友元函數

有權通路類的所有私有(private)成員和保護(protected)成員。盡管友元函數的原型有在類的定義中出現過,但是友元函數并不是成員函數。友元可以是一個函數,該函數被稱為友元函數;友元也可以是一個類,該類被稱為友元類,在這種情況下,整個類及其所有成員都是友元。

如果要聲明函數為一個類的友元,需要在類定義中該函數原型前使用關鍵字 friend

為什麼要引入友元函數:

在實作類之間資料共享時,減少系統開銷,提高效率

具體來說:為了使其他類的成員函數直接通路該類的私有變量

  即:允許外面的類或函數去通路類的私有變量和保護變量,進而使兩個類共享同一函數

  優點:能夠提高效率,表達簡單、清晰

  缺點:友元函數破環了封裝機制,盡量不使用成員函數,除非不得已的情況下才使用友元函數。

2、什麼時候使用友元函數:

  1)運算符重載的某些場合需要使用友元。

  2)兩個類要共享資料的時候

3、怎麼使用友元函數:

友元函數的參數:

   因為友元函數沒有this指針,則參數要有三種情況:

   1、  要通路非static成員時,需要對象做參數;--常用(友元函數常含有參數)

   2、  要通路static成員或全局變量時,則不需要對象做參數

   3、  如果做參數的對象是全局對象,則不需要對象做參數

友元函數的位置:

因為友元函數是類外的函數,是以它的聲明可以放在類的私有段或公有段且沒有差別。

友元函數的調用:

可以直接調用友元函數,不需要通過對象或指針

友元函數的分類:

根據這個函數的來源不同,可以分為三種方法:

1、普通函數友元函數:

   a) 目的:使普通函數能夠通路類的友元

   b) 文法:聲明位置:公有私有均可,常寫為公有

                    聲明: friend + 普通函數聲明

                    實作位置:可以在類外或類中

                    實作代碼:與普通函數相同(不加不用friend和類::)

                    調用:類似普通函數,直接調用

代碼如下:

#include <iostream>
 
using namespace std;
 
class Box
{
   double width;
public:
   friend void printWidth( Box box );
   void setWidth( double wid );
};

// 成員函數定義
void Box::setWidth( double wid )
{
    width = wid;
}

// 請注意:printWidth() 不是任何類的成員函數
void printWidth( Box box )
{
   /* 因為 printWidth() 是 Box 的友元,它可以直接通路該類的任何成員 */
   cout << "Width of box : " << box.width <<endl;
}
 
// 程式的主函數
int main( )
{
   Box box;
 
   // 使用成員函數設定寬度
   box.setWidth(10.0);
   
   // 使用友元函數輸出寬度
   printWidth( box );
 
   return 0;
}      

内聯函數:

C++ 内聯函數是通常與類一起使用。如果一個函數是内聯的,那麼在編譯時,編譯器會把該函數的代碼副本放置在每個調用該函數的地方。

對内聯函數進行任何修改,都需要重新編譯函數的所有用戶端,因為編譯器需要重新更換一次所有的代碼,否則将會繼續使用舊的函數。

如果想把一個函數定義為内聯函數,則需要在函數名前面放置關鍵字 inline,在調用函數之前需要對函數進行定義。如果已定義的函數多于一行,編譯器會忽略 inline 限定符。

在類定義中的定義的函數都是内聯函數,即使沒有使用 inline 說明符。

為什麼要使用内聯函數

在c語言中,宏定義是我們保護效率的一大妙招,(宏:代碼處不加驗證的簡單替代,在編譯前将程式中有關字元串替換成宏體)如 defin pi 3.14,用3.14替換pi這個字元在程式運作前。

但是在c++中,由于私有成員不能存取,宏作用為成員函數就很無用,是以引入了内斂函數。

内斂函數定義格式

inline 傳回值類型 函數名(形式參數表)

{//函數體} //即普通函數前,加上inline即可成為内聯函數。

作用:像宏一樣展開,是以不需要花費進行參數傳遞,儲存調用狀态和傳回位址的時間。

缺點:花費大量空間

内聯函數實際上是一種空間換時間的做法。

c++類内給出函數體定義的成員函數被預設為内聯函數,類外給出函數體的成員函數不是内聯函數。

内聯函數注意事項:

代碼展示:

#include <iostream>
using namespace std;

inline int Aa(int a,int s){

    return (a>s)?a:s;
}
int main()
{
    cout <<Aa(2,3)<<endl;
    cout <<Aa(6,3)<<endl;
    cout <<Aa(72,3)<<endl;
    cout <<Aa(8,3)<<endl;
    return 0;
}      
3
6
72
8