zoukankan      html  css  js  c++  java
  • C++友元函数

    1、友元函数介绍:

         

         1.1为什么使用友元函数?

              在类之间实现数据共享,减少系统开销,提高效率。即一个类可以无限制的存取另一个类的成员。例如:如果类A是类B的友元函数,那么类A中该函数是类B的友元函数。也就是说A的成员函数可以直接访问B类的私有变量、公有成员和公有成员。

         1.2友元函数的优缺点?

            优点:提高效率,表达简单、清晰。

            缺点:破坏了封装和数据隐藏,导致程序的可维护性变差。


    2、友元函数图解:

          

         func()函数是该类的外部函数,友元函数能够访问friend所在类(Two)的所有对象的私有成员、公有成员和保护成员。



    3、友元函数的使用

       

        3.1类本身的友元函数

                目的:使普通函数能够访问类的成员

                声明:friend + 普通函数

               实现位置:类内或类外

               调用:直接调用

               代码:

           

    class Two
    {
    	friend void Print(Const Two& obj);
    };
    
    void Print(Const Two& obj)
    {
    	//函数体
    }
    
    void main()
    {
    	Two obj;
    	Print(obj);//直接调用
    }

        3.2将成员函数用作友元

                  目的:是类One的一个成员函数称为类Two的友元,使该函数直接访问Two的私有变量              

                  声明:friend + 成员函数的声明

                  声明位置:声明在公有中

                  调用:先声明One对象one ---- 使用one调用个自己的成员函数 

    class One{
    	void func(Two&);  //声明本类的成员函数,参数为Two类的引用
    }
    
    class Two
    {
    	friend void One::func(Two&);
    };
    
    void main()
    {
    	One Obj1(5);
    	Two Obj2(8);
    	Obj1.func(Obj2);
    }

           3.3将一个类说明为另一个类的友元

                目的:使用单个声明One类是Two类的友元,则One 这个类的成员函数均具有友元函数的性能。

                声明:friend + 类名

                声明位置:另一个类的公有或私有均可

    class Two{
    	private:
    		int y;
    	public:
    		friend class One; //声明One为Two的友元
    }
    
    class One
    {
    	private:
    		int x;
    	public:
    		One(int a,Two&r,int b)
    		{
    			x=a;
    			r.y =b;
    		}
    		void Display(Two&r);
    };
    void One::Display(Two&r)
    {
    	cout<<x<<""<<r.y<<endl;
    }
    
    void main()
    {
    	
    	Two Obj2;
    	One Obj1(2,Obj2,5);
    	Obj1.Display(Obj2);//直接调用函数
    }


    4、友元函数总结:

          4.1友元函数不是成员函数

          4.2成员函数有this指针,而友元函数没有this指针

          4.3友元函数不能被传递,也不具有交换性






  • 相关阅读:
    【Django总结】Django警告Not Found: /favicon.ico
    【性能学习】Windows自带性能监控工具perform
    【Linux学习】定时任务和后台运行相关命令
    【Python学习】Python 写Windows Service服务程序
    【Django总结】ORM
    【Python学习】Python requests.post方法中data与json参数区别
    【Pycharm学习】Pycharm散记
    【Pycharm学习】离线安装插件
    【Mysql学习】索引操作
    [HG]奋斗赛G
  • 原文地址:https://www.cnblogs.com/zsswpb/p/6329428.html
Copyright © 2011-2022 走看看