zoukankan      html  css  js  c++  java
  • c/c++ 友元基本概念

    友元基本概念:

    1,把一个一般函数声明为一个类的友元函数

    2,把一个类A的某几个成员函数声明为某个类B的友元函数

    3,把一个类A声明为一个类B的友元类。

    友元的作用:可以访问类B里所有的成员变量和成员方法,不管是public,protected,还是private。

    1,把一个一般函数show声明为一个类的友元函数

    #include <iostream>
    using namespace std;
    
    class Test{
      friend void show(const Test &t);
    public:
      Test(int d = 0) : data(d){}
    private:
      void fun()const{
        cout << "fun:" << data << endl;
      }
      int data;
    };
    
    //友元,即可以访问私有成员变量,也可以访问私有方法                 
    void show(const Test &t){
      cout << "friend of Test:" << t.data << endl;
      t.fun();
    }
    
    int main(){
      Test t(100);
      show(t);
    
      return 0;
    }
    

    2,把一个类A的fun成员函数声明为类Test的友元函数,但是类A的fun1函数不是类Test的友元函数,所以在fun1里不能够访问Test的私有成员。

    #include <iostream>
    using namespace std;
    
    class Test;
    
    class A{
     public:
      A(int d = 0) : data(d){}
      void fun(const Test &t);
      void fun1(const Test &t);
    
     private:
      int data;
    };
    
    class Test{
      friend void A::fun(const Test &t);
    public:
      Test(int d = 10) : data(d){}
    private:
      int data;
    };
    
    void A::fun(const Test &t){
      cout << t.data << endl;
    }
    void A::fun1(const Test &t){
      //编译不能通过,因为fun1不是class Test的友元函数。               
      //cout << t.data <<endl;                                         
    }
    int main(){
      Test t(100);
      A a;
      a.fun(t);
    }
    

    3,把类B声明为一个类Test的友元类,因此,类B的所有public成员函数都是类Test的友元函数。

    #include <iostream>
    using namespace std;
    
    class Test;
    
    class B{
    public:
      void fun1(const Test &t);
      void fun2(const Test &t);
    };
    
    class Test{
      friend class B;
    public:
      Test(int d = 0) : data(d){}
    private:
      void pri()const{
        cout << "pri" << endl;
      }
      int data;
    };
    
    void B::fun1(const Test &t){
      cout << t.data << endl;
    }
    void B::fun2(const Test &t){
      t.pri();
    }
    
    int main(){
      Test t(10);
      B b;
      b.fun1(t);
      b.fun2(t);
    }
    
  • 相关阅读:
    MySql不允许对同一张表同时进行查询和更新
    MysSql 显示不了中文、乱码问题
    SpringBoot参数访问
    那些年我看过的好文
    关于远程调试
    算法题
    Spring Boot 注解学习
    linux 设置ssh免密登录
    ORA各种错误
    listener.ora tnsnames.ora
  • 原文地址:https://www.cnblogs.com/xiaoshiwang/p/9502990.html
Copyright © 2011-2022 走看看