C++的友元函式
阿新 • • 發佈:2018-11-15
類的友元函式申明在類內部,定義在外部。(怎麼記得好像有一個東西也是這麼玩的,好吧,原來是靜態變數和靜態函式,不過不同的是,靜態的東西,它們還是屬於這個類的,而且定義靜態成員的時候是要加作用範圍),它實際上是可以理解為是插入類內部的一個間諜,可以獲取類內部的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