1. 程式人生 > >C++的友元函式

C++的友元函式

類的友元函式申明在類內部定義在外部。(怎麼記得好像有一個東西也是這麼玩的,好吧,原來是靜態變數和靜態函式,不過不同的是,靜態的東西,它們還是屬於這個類的,而且定義靜態成員的時候是要加作用範圍),它實際上是可以理解為是插入類內部的一個間諜,可以獲取類內部的protected和private的資訊,emmm,難怪好多人不建議用它,說是破壞了C++的封裝性。

儘管友元是在類裡面申明的,但是它並不是類裡面的成員

友元可以是一個函式,該函式被稱為友元函式;友元也可以是一個類,該類被稱為友元類,在這種情況下,整個類及其所有成員都是友元。

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

,如下所示:

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

宣告類 ClassTwo 的所有成員函式作為類 ClassOne 的友元,需要在類 ClassOne 的定義中放置如下宣告:

friend class ClassTwo;

這個姑且不做詳細討論,因為幾乎不用,用到的最多就是友元函式:

#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;
}

當上面的程式碼被編譯和執行時,它會產生下列結果:

Width of box : 10

因為友元函式沒有this指標,則引數要有三種情況: 

1.要訪問非static成員時,需要物件做引數;

2.要訪問static成員或全域性變數時,則不需要物件做引數;

3.如果做引數的物件是全域性物件,則不需要物件做引數.可以直接呼叫友元函式,不需要通過物件或指標

不過一般非靜態成員,都按照下面的套路寫的:

class INTEGER
{
    friend void Print(const INTEGER& obj);//宣告友元函式
};

void Print(const INTEGER& obj)
{
    //函式體
}

void main()
{
    INTEGER obj;
    Print(obj);//直接呼叫
}

以上。

友元就這麼結束了,不知道大家有沒有理解,不理解的話歡迎討論互相學習,一起進步。

這篇文章主要參考以下連結,自己寫的例子感覺沒他的好,就直接用了啊。

參考:http://www.runoob.com/cplusplus/cpp-friend-functions.html