• 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各成员;
  • 相关阅读:
    HTTP客户端识别与Cookie机制
    javascript模式之模块模式
    js类式继承模式学习心得
    关于html自闭合标签要不要加空格和斜杠的问题?
    分享两件有趣的事情
    PS Web切图界面设置
    这是什么
    关于前后端分离我的理解
    模块化方案esl以及amd的依赖方式
    node 内存管理相关
  • 原文地址:https://www.cnblogs.com/weiyouqing/p/9648757.html
Copyright © 2020-2023  润新知