您的位置:首页 > 编程语言 > C语言/C++

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

2016-08-30 19:24 218 查看
友元、友元类、友元函数知识点总结
 

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++