zoukankan      html  css  js  c++  java
  • 【C++基础 05】友元函数和友元类

    友元是一种定义在类外部的普通函数或类,但它须要在类体内进行说明,为了与该类的成员函数加以差别,在说明时前面加以keywordfriend。

    友元不是成员函数,可是它能够訪问类中的私有成员。

    友元的作用在于提高程序的执行效率。可是,它破坏了类的封装性和隐藏性,使得非成员函数能够訪问类的私有成员。

    有两种形式的友元:

    (1)友元函数:普通函数对一个訪问某个类中的私有或保护成员。

    (2)友元类:类A中的成员函数訪问类B中的私有或保护成员。


    友元函数:

    在类声明的不论什么区域中声明,而定义则在类的外部。

    friend <类型><友元函数名>(<參数表>);  

    演示样例:

    class A
    {
    public:
      A(int _a):a(_a){};
    
      friend int getA_a(A &_classA);//友元函数
    
    private:
      int a;
    };
    
    int getA_a(A &_classA)
    {
      return _classA.a;//通过对象名訪问私有变量
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
      A _classA(3);
      std::cout<<getA_a(_classA);//友元函数仅仅是普通函数。能够在随意地方调用
      return 0;
    }
    须要注意的是:

    (1)友元函数不是类成员函数,没有this指针。
    (2)友元函数是类外的函数。所以它的声明能够放在类的私有段或公有段且没有差别。
    (3)友元函数仅仅是一个普通函数,并非该类的类成员函数,它能够在不论什么地方调用,友元函数中通过对象名来訪问该类的私有或保护成员。

    友元类:

    能够理解为:类B的全部成员函数都为类A的友元函数,则类B为类A的友元类。

    friend class <友元类名>;  

    演示样例:

    class girl;
    
    class boy
    
    {
    public:
      void disp(girl &);
    };
    
    void boy::disp(girl &x) //函数disp()为类boy的成员函数。也是类girl的友元函数
    {
      cout<<"girl's name is:"<<x.name<<",age:"<<x.age<<endl;//借助友元,在boy的成员函数disp中,借助girl的对象,直接訪问girl的私有变量
    }
    
    class girl
    {
    private:
      char *name;
      int age;
      friend boy; //声明类boy是类girl的友元
    };

    须要注意的是,友元类没有继承性和传递性
    (1)没有继承性:假如类B是类A的友元,类C继承于类A,那么友元类B是没办法直接訪问类C的私有或保护成员。
    (2)没有传递性:假如类B是类A的友元,类C是类B的友元,那么友元类C是没办法直接訪问类A的私有或保护成员,也就是不存在“友元的友元”这样的关系。






  • 相关阅读:
    (转)创建Windows服务(Windows Services)N种方式总结
    无法加载协定为“ServiceReference1.xxxxxx”的终结点配置部分,因为找到了该协定的多个终结点配置。请按名称指示首选的终结点配置部分。
    《App架构实践指南》
    Awesome Projects (汇聚全球所有🐮项目,你值得拥有)
    【公告】个人站点及系列文章
    Android+TensorFlow+CNN+MNIST 手写数字识别实现
    TensorFlow基础
    UiAutomator2.0升级填坑记
    那些年,从博客到出书的博主
    Appuim源码剖析(Bootstrap)
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/6728200.html
Copyright © 2011-2022 走看看