C++之友元


1.友元函數的一般形式:

  friend <返回類型> <函數名>(<參數列表>);

#include <iostream>
using namespace std;

class Test
{
    friend class Object;   //友元類
    friend void g_func();  //友元函數
    Test()
    {
        a = 10;
    }
private:
    int a;
    void func()
    {
        cout << "this is Test private func a = " << a << endl;
    }
};

class Object    //友元類
{
public:
    void ObjFunc()
    {
        Test t;
        t.a = 30;
        t.func();
    }
};

void g_func()   //友元函數
{
    Test t;
    t.a = 99;
    t.func();
}

int main(int argc, char** argv)
{
    Object cc;
    cc.ObjFunc();

    g_func();

    system("pause");
    return 0;
}

 

2.注意點:

  1. 類中通過使用關鍵字friend 來修飾友元函數,但該函數並不是任何類的成員函數,其聲明可以放在類的私有部分,也可放在共有部分。友元函數的定義在類體外實現,不需要加類限定
class Test
{
    Test()
    {
        a = 10;
    }
private:
    friend class Object;
    friend void g_func();


    int a;
    void func()
    {
        cout << "this is Test private func a = " << a << endl;
    }
};

  2. 一個類中的成員函數可以是另外一個類的友元函數,而且一個函數可以是多個類友元函數。

#include <iostream>
using namespace std;

class Test;
class ObjTest
{
public:
    ObjTest(){}
public:
    void Func2(Test & tt);           //在聲明為Test友元函數之前,必須只是聲明,不能定義,否則編譯不過,個人理解原因:編譯之前尚未確定是Test的友元函數,導致無法訪問private成員;     
};

class Test
{
public:
    friend void ObjTest::Func2(Test & tt); //一個類的成員函數,作為另外一個類的友元函數;

    Test()
    {
        a = 10;
    }

private:
    int a;
    void func()
    {
        cout << "this is Test private func a = " << a << endl;
    }
};

void ObjTest::Func2(Test & tt)        //聲明為Test之后在定義;
{
    tt.a = 340;
    tt.func();
}

int main(int argc, char** argv)
{
    ObjTest jj;
    Test tt;
    jj.Func2(tt);

    system("pause");
    return 0;
}
  1. 友元函數可以訪問類中的私有成員和其他數據,但是訪問不可直接使用數據成員,需要通過對對象進行引用
  2. 友元函數在調用上同一般函數一樣,不必通過對對象進行引用。
  3. 可以把類聲明為友元,但是“朋友”只能是單向的,被聲明為朋友的類csthing,可以不受protected,protected的限制訪問CObject各成員;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM