c++的友元

来源:互联网 发布:下三白眼怎么矫正 知乎 编辑:程序博客网 时间:2024/04/30 00:57

  来说点简单的东西吧,c++的友元。

  c++是一门面向对象的语言,说到面向对象,就肯定要想起其3大特性:封装、继承和多态。类中的私有成员是不可被外界访问的,这是数据的封装性。然而,在有些场合,为了程序的高效性,外部想要直接访问类的私有成员,这现实吗?在c++语言里,可以实现。这就是友元

直接上代码:

class cls{private:    int x;public:    cls(int a) : x(a)    {}    int getVar()    {        return x;    }};int main(void){    cls c(6);    std::cout << "c.x = " << c.x << std::endl;       //不用说,直接访问私有成员肯定编译报错    std::cout << "c.x = " << c.getVar() << std::endl;       return 0;}

  main函数作为cls类的一个外部函数,想要访问cls私有成员,有一个办法就是让main()函数声明为cls类的友元函数:

class cls{private:    int x;public:    cls(int a) : x(a)    {}    int getVar()    {        return x;    }    friend int main(void);};

如此,编译通过且能正确运行了。
这里写图片描述

  在类中用friend关键字对函数或者类进行声明,就可将该函数或者类声明为友元。需要注意的是,千万不用以为main()函数此时变成cls类的成员函数!~它依旧是个外部函数,只是是一个具有访问本类任何成员,包括私有成员的外部函数。当然啦,要访问非静态的成员函数/变量,还是要先实例化类。

  友元是c++中发生在函数与类之间,或者类与类之间的一种关系,这种关系是单向的。例如,类a是类b的友元类:

class a{    //...};class b{    //...    friend class a;};

  因为友元关系是单向的,所以类a的所有成员函数可以访问类b的所有成员变量/函数,但反过来则不可以,类b的所有成员函数不可以访问类a的私有成员。

  除了单向,友元关系还是不能传递的。例如类b是类a的友元类,类c是类b的友元类:

class a{    //...    friend class b;};class b{    //...    friend class c;};class c{    //...};

  由于友元关系不可传递,所以类c并非类a的友元类。

  友元的诞生是为了兼顾c语言的高效,但是它会破坏了面向对象语言的封装性,在软件工程中似乎被逐渐遗弃,在c++之后诞生的语言,如java、c#等,也都已经不存在友元这种关系了。c++友元的使用,开发者需要考虑其必要性了。

原创粉丝点击