friend函數(shù)&inline函數(shù)

友元函數(shù)

類的友元函數(shù)是定義在類外部,但有權(quán)訪問類的所有私有(private)成員和保護(hù)(protected)成員。盡管友元函數(shù)的原型有在類的定義中出現(xiàn)過,但是友元函數(shù)并不是成員函數(shù)。

友元可以是一個(gè)函數(shù),該函數(shù)被稱為友元函數(shù);友元也可以是一個(gè)類,該類被稱為友元類,在這種情況下,整個(gè)類及其所有成員都是友元。

如果要聲明函數(shù)為一個(gè)類的友元,需要在類定義中該函數(shù)原型前使用關(guān)鍵字 friend,如下所示:

class Box
{
   double width;
public:
   double length;
   friend void printWidth( Box box );
   void setWidth( double wid );
};

聲明類 ClassTwo 的所有成員函數(shù)作為類 ClassOne 的友元,需要在類 ClassOne 的定義中放置如下聲明:

friend class ClassTwo;

實(shí)例

#include <iostream>
 
using namespace std;
 
class Box
{
   double width;
public:
   friend void printWidth( Box box );
   void setWidth( double wid );
};
 
// 成員函數(shù)定義
void Box::setWidth( double wid )
{
    width = wid;
}
 
// 請注意:printWidth() 不是任何類的成員函數(shù)
void printWidth( Box box )
{
   /* 因?yàn)?printWidth() 是 Box 的友元,它可以直接訪問該類的任何成員 */
   cout << "Width of box : " << box.width <<endl;
}
 
// 程序的主函數(shù)
int main( )
{
   Box box;
 
   // 使用成員函數(shù)設(shè)置寬度
   box.setWidth(10.0);
   
   // 使用友元函數(shù)輸出寬度
   printWidth( box );
 
   return 0;
}

當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會產(chǎn)生下列結(jié)果:

Width of box : 10

內(nèi)聯(lián)函數(shù)

C++ 內(nèi)聯(lián)函數(shù)是通常與類一起使用。如果一個(gè)函數(shù)是內(nèi)聯(lián)的,那么在編譯時(shí),編譯器會把該函數(shù)的代碼副本放置在每個(gè)調(diào)用該函數(shù)的地方。

對內(nèi)聯(lián)函數(shù)進(jìn)行任何修改,都需要重新編譯函數(shù)的所有客戶端,因?yàn)榫幾g器需要重新更換一次所有的代碼,否則將會繼續(xù)使用舊的函數(shù)。

如果想把一個(gè)函數(shù)定義為內(nèi)聯(lián)函數(shù),則需要在函數(shù)名前面放置關(guān)鍵字 inline,在調(diào)用函數(shù)之前需要對函數(shù)進(jìn)行定義。如果已定義的函數(shù)多于一行,編譯器會忽略 inline 限定符。

在類定義中的定義的函數(shù)都是內(nèi)聯(lián)函數(shù),即使沒有使用 inline 說明符。

實(shí)例

下面是一個(gè)實(shí)例,使用內(nèi)聯(lián)函數(shù)來返回兩個(gè)數(shù)中的最大值:

#include <iostream>
 
using namespace std;

inline int Max(int x, int y)
{
   return (x > y)? x : y;
}

// 程序的主函數(shù)
int main( )
{

   cout << "Max (20,10): " << Max(20,10) << endl;
   cout << "Max (0,200): " << Max(0,200) << endl;
   cout << "Max (100,1010): " << Max(100,1010) << endl;
   return 0;
}

當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會產(chǎn)生下列結(jié)果:

Max (20,10): 20
Max (0,200): 200
Max (100,1010): 1010

關(guān)于內(nèi)聯(lián)函數(shù)的補(bǔ)充

使用內(nèi)聯(lián)函數(shù)是為了解決程序中函數(shù)調(diào)用的效率問題,內(nèi)聯(lián)函數(shù)會在程序編譯時(shí)用內(nèi)聯(lián)函數(shù)的函數(shù)體替換內(nèi)聯(lián)函數(shù)的調(diào)用表達(dá)式;
而一般的函數(shù)調(diào)用則是在程序執(zhí)行時(shí)才將函數(shù)體替換掉其函數(shù)調(diào)用表達(dá)式;
故而將一部分函數(shù)置為內(nèi)聯(lián)函數(shù)能夠降低程序運(yùn)行時(shí)所需的函數(shù)體替換表達(dá)式的時(shí)間壓力;
但如果內(nèi)聯(lián)函數(shù)的函數(shù)體過大,則會加大編譯階段的時(shí)間壓力,反而使總耗時(shí)增加,得不償失;
因此在使用內(nèi)聯(lián)函數(shù)時(shí)要留神:

1.在內(nèi)聯(lián)函數(shù)內(nèi)不允許使用循環(huán)語句和開關(guān)語句;
2.內(nèi)聯(lián)函數(shù)的定義必須出現(xiàn)在內(nèi)聯(lián)函數(shù)第一次調(diào)用之前;
3.類結(jié)構(gòu)中所在的類說明內(nèi)部定義的函數(shù)是內(nèi)聯(lián)函數(shù)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容