C语言C++雾高血压脑出血景1:友元类与面向对象

贰.友元关系与面向对象:

接下去大家聊天怎么从面向对象的角度去精晓友元关系。(以下内容皆为私家领会,有不确切之处望能指正

  • 1)友元函数
     友元函数是不从属与类的函数,除了可以访问类的村办变量之外,与此外完结在类外部的函数无差距。从面向对象的角度看,函数是不应有单独达成于类之外的。显著独立与类之外的友元函数,从面向对象的角度来考虑,是不优雅的消除方法。
     这和C++本人包容C语法有关,如操作符<<的重载利用的就是友元函数。<<的函数重载如下,这么些函数是独自与类之外完毕的方法:

    friend ostream &operator<<(ostream &output, const object &o)
    

      显明,这么些<<的函数方法更应当从属在ostream这些类之中,做为2个可重载的章程完成。如下概念

    friend ostream &operator<<(const object &o) //作为ostream的类函数
    

      如Java,Scala,Python都不帮助独立与类存在定义的函数了。在面向对象的角度,后续的言语实现的更为纯粹了。所以假如本身代码风格趋近与面向对象的品格,就活该尽量理由友元类来实现内需的机能,而不是应用友元函数。
      有心上人私信小编说:Python之中明美赞臣直def就足以定义函数了,也不供给类呀,那是或不是也不相符面向对象的逻辑考虑?那里大约解释一下,Python之中的每一种函数,都会被打包成多少个function对象,所以Python之中是百分百皆对象的,不会设有独立与类存在的函数。而就如Java与Scala之中的lambda表明式,也是包装为匿名类存在的。

  • 2)友元类
    通过友元类包装之中,友元类摇身1变,类之中全数的法子都改成友元函数了。看起来并不会损坏上文提到的面向对象的逻辑了,然而涉及到持续又存在一些相当的小十分大的坑,大家联合来捋一捋:
      友元关系不可能一连。基类的友元对派生类的成员未有优异国访问问权限。固然基类被授予友元关系,则只有基类具有特种访问权限,该基类的派生类不能够访问授予友元关系的类。
      好复杂,大家平昔上代码:

    #include
    using namespace std;

    class A {
    private:

    int x;
    

    friend class C;
    };

    class B:public A{
    private:

    int y;
    

    };

    class C {

    void printA(A& a) {
        cout << a.x << endl;
    }
    void printB(B& b) {
        cout << b.x << endl; //C类依然可以利用友元关系访问从B类从A类继承来的私有变量
        //cout << b.y << endl; C类不可以访问B类的私有变量,友元关系不继承,该语句不合法。
    }
    

    };

旗帜鲜明,类C与A的友元关系止步于继承处,类C没办法访问类B新定义的私人住房变量。(此地留2个未有失水准给我们,假使类B覆盖了类A的个体变量x,类C之中的printB是不是还是能够经过编写翻译呢?)

我们再看1段差别的代码:

#include <iostream>
using namespace std;

class A
{
    int x;
public:
    friend class B;
};
class B
{
public:
    void fun(A& a){ cout << a.x << endl;}
};

class C:public B
{
public:
    //void fun2(A& a){ cout <<a.a <<endl;}   //派生类新加的函数却不能访问A,此句会报错
};

void main()
{
    A a;
    C c;
    c.fun(a); //C是B的派生类,只能基类B的函数fun来访问A的对象
}

类C尽管再而三了类B,可是也不在具有了和A的友元关系,只好”拼爹”。信赖从类B之中继承的友元函数来访问类A。(此地同样留贰个没不符合规律给大家,假使类B之中的fun函数是protected或private的,那上述代码还能够够符合规律编写翻译吗?)

  在此间做多个简单易行的下结论:友元关系在友元类之中没有继承性,只好借助基类的友元关系。

一.友元函数:

开始比赛先不难介绍一下友元这几个定义吗。
在C++之中,类的友元函数是概念在类外部,但它有权访问类的全数民用(private)成员和保卫安全(protected)成员。就算友元函数的原型有在类的定义中出现过,不过友元函数并不是成员函数。友元能够是贰个函数,该函数被誉为友元函数;友元也得以是3个类,该类被称为友元类。

直接上个代码,大家看看友元函数与友元类具体是什么使用的:

#include <iostream>
using namespace std;

class Box {
public:
    Box(double l, double b, double h) {
        length = l;
        breadth = b;
        height = h;
    }
    friend class A;
    friend void boxPrintBox(Box &box);
private:
    double length;
    double breadth;
    double height;
};

//友元函数,友元函数并非成员函数
void boxPrintBox(Box &b) {
    cout << b.height << " " << b.length << " " << b.breadth << endl;
}

//友元类
class A {
public:
    void printBox(Box &b) {
        cout << b.height << " " << b.length << " " << b.breadth << endl;
    }
};


int main() {
    Box box(1,2,3);

    //友元函数,可以访问Box类的private的变量
    boxPrintBox(box);
    //友元类,同样可以访问Box类的private的变量
    A a;
    a.printBox(box);

    return 0;
}

上边的代码能够见见,友元函数和友元类都足以直接待上访问到对象的私有变量。接下来我们来分析一下友元函数的特色。

  • 1、为啥要引进友元函数:
    在贯彻类之间数据共享时,减弱系统开发,提升效用。具体来说:为了使其余类的成员函数直接待上访问该类的村办变量。即:允许外面包车型客车类或函数去访问类的民用变量和保卫安全变量,从而使四个类共享同1函数。可以进步效能,表达不难、清晰
  • 二、哪一天使用友元函数:
    一)运算符重载的壹些地方必要运用友元。
    贰)八个类要共享数据的时候
  • 三、友元格局的毛病:
    ①)友元函数破环了打包机制,除非万不得已的意况下才使用友元函数。

三.非C++语言是怎么化解友元关系的:

  • Java
    JAVA修饰符类型(public,protected,private)
  • public的类、类属变量及措施,包内及包外的别的类均能够访问;
  • protected的类、类属变量及措施,包内的任何类,及包外的那多少个继承了此类的子类才能访问;
  • private的类、类属变量及措施,包内包外的任何类均无法访问;
  • 万一二个类、类属变量及方法不以那三种修饰符来修饰。那么包内的其它类都得以访问它,而包外的其余类都不能够访问它(包蕴包外继承了此类的子类)。所以那类别型有时也号称friendly类型,现在知道那几个名字的出处了啊,大家对同二个package之中要放什么类有木有新的认识了吗?

  • Scala
    在Scala之中,private和protected能够钦赐额外的参数。能够利用private[AccessQualifier],AccessQualifier能够是this,也足以是别的的类名或包名。那样就能够那样精晓:那几个成员对全部类都以private,除了本人和AccessQualifier所表示范围内的类。那个定义也是足以递推的,也便是说,即便AccessQualifier是多个类,那么private成员对于AccessQualifier的AccessQualifier也是可知的。
    好优雅的方法啊,小编爱Scala。

  • Python
    老子他喵的尚未访问控制,全靠自觉。

  • Golang
    正如野蛮,就靠首字母的高低写区分。无法实现细粒度的操纵,可是看起来也不影响大多数情景的工程达成。所以是不是那样化繁为简的布置性医学,也是1种优雅的布署性呢?

因为一而再准备入职的铺面都盼望能转C++,所以方今也是鲁人持竿的先导展开C++的读书。然后这几个体系的篇章打算追究C++的语言特征,也正如一下不等语言(如Java,Scala,Python,Go)之间的宏图工学,同时也投石问路的期待能有大咖们的引导。近年来在攻读进程里面接触了友元函数与友元类的定义,第一篇作品大家就聊聊友元的概念。