1. 程式人生 > >C++解析四-友員函數、內聯函數、靜態成員

C++解析四-友員函數、內聯函數、靜態成員

stream 使用 friend 但是 sin 編譯 mach pac ons

友元函數

類的友元函數是定義在類外部,但有權訪問類的所有私有(private)成員和保護(protected)成員。盡管友元函數的原型有在類的定義中出現過,但是友元函數並不是成員函數。
友元可以是一個函數,該函數被稱為友元函數;友元也可以是一個類,該類被稱為友元類,在這種情況下,整個類及其所有成員都是友元。
如果要聲明函數為一個類的友元,需要在類定義中該函數原型前使用關鍵字 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; }

編譯輸出:

kevin@kevin-virtual-machine:~/Documents/Test/C++/four$ ./friend_func 
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);//直接調用
}

C++解析四-友員函數、內聯函數、靜態成員