C++学习笔记-友元理论详解

来源:互联网 发布:复杂网络 机器人定位 编辑:程序博客网 时间:2024/05/19 22:01

友元、友元类、友元函数知识点总结

 

1、什么是友元?

 

由于有了类这样的机制,实现了数据的隐藏和封装,也就是说累的一般成员被定义为私有成员,成员函数一般被定义为公有的,

类内部的成员函数可以访问类中的私有成员,这样就实现了数据的隐藏。但是这样出现了一个问题,有时候需要定义

一个类外部的函数,但是这个函数又需要经常的访问类中的数据成员,这时候将这些函数定义为该函数的友元函数,就能够实

非类内部的函数访问类中的私有成员


友元实现了外部函数可以访问类内部私有成员的目的,但是它破坏了类的封装性和隐藏性。

那么这样更加灵活的方式是程序员在工程中根据需要而选择使用的。


所以没有一个规则是完美的,只有用在和合适的地方规则才是最贴切的。

 

2、友元函数

//友元函数可以访问类的私有变量也可以访问私有函数

2.1、直接定义在类的内部

class mywindow

{

    MainWindow *p;

 

    void friend showwindow(mywindow *pwin)

    {

        pwin->p = new MainWindow;

        pwin->p->show();

    }

};


2.2、 声明在类的内部,需要加上friend,定义在类的外部,不需要加上friend

class mywindow

{

    MainWindow *p;

 

    void friend showwindow(mywindow *pwin);

};

void showwindow(mywindow *pwin)

{

    pwin->p = new MainWindow;

    pwin->p->show();

}

 

注意:

1)友元函数的声明可以放在类的私有部分,也可以放在公有部分,它们是没有区别的,都说明是该类的一个友元函数。
2)、一个函数可以是多个类的友元函数,只需要在各个类中分别声明。
2)、友元函数的调用与一般函数的调用方式和原理一致。

 

3、友元类


       友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的隐藏信息(包括私有成员和保护成员)。       
       当希望一个类可以存取另一个类的私有成员时,可以将该类声明为另一类的友元类。定义友元类的语句格式如下:
       friend class 类名;
       其中:friend和class是关键字,类名必须是程序中的一个已定义过的类。

       例如,以下语句说明类B是类A的友元类:
       class A
       {
              …
       public:
              friend class B;
              …
       };
       经过以上说明后,类B的所有成员函数都是类A的友元函数,能存取类A的私有成员和保护成员。

       使用友元类时注意:
             (1) 友元关系不能被继承。 
             (2) 友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。
             (3) 友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的申明

友元的优点:

使得累的封装这个密不透风的墙,有了条件性的通道——在友元情况下,可以访问这面墙内部的私有成员;

友元的缺点:

破坏了封装性;

 

思想方法:

如果将类的封装比喻成一堵墙的话,那么友元机制就像墙上了开了一个门,那些得到允许的类或函数允许通过这个门

访问一般的类或者函数无法访问的私有属性和方法。友元机制使类的封装性得到消弱,所以使用时一定要慎重。


参考:http://blog.csdn.net/adriano119/article/details/5914443

0 0
原创粉丝点击