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各成员;
原文地址:https://www.cnblogs.com/weiyouqing/p/9648757.html