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

C++友元机制来源与规则

2009-04-15 13:54 169 查看
前两天,一个朋友学C#问我,在c++中面向对象不是要进行数据封装吗,怎么会出现友元这种情况呢,明显的破坏封装性嘛。呵呵,当时我也没给说出什么来。后来看了点资料才发现,友元原来是这么来的。
在C++ 刚刚产生的时候,它是符合斯图亚特模型的,具有面向对象的特征。但是后来发现类与类之间的交往比较的少,尽管子类可以访问父类的Protect属性的内容,但是,当时的类看起来就行一个孑然一身的人。后来,它的发明者布亚那决定向其中添入一些新的元素,这就是友元。他创建了友元声明的语法,并以此允许其他的类或函数访问类的私有或受保护的成员。这样,一个类就可以超越它的基类,并服务于它的友元类和友元函数,可以与它的友元类和友元函数合为一体。友元关系的价值在于C++类成员之影响力的传播,友元关系可促进C++王朝的繁荣,为那些有访问需求的类适当开放受保护成员的访问许可。友元关系,象其他访问许可一样,是由类授出的,而不是由友元类单方面攫取的。
友元机制非常重要。它允许一个函数同时成为两个类的友元,这可以使类的设计者用友元函数来替代那些不适合开放给普通用户的成员函数。换句话说,使用友元函数可以增强接口的清晰度。这是因为,我们在两个类中提供相关的成员函数的做法通常会使接口变得更为复杂,合适的做法往往是将接口声明为全局函数,而普通的全局函数又无法访问类的私有和受保护的成员,这时,我们就需要用友元函数来创建更为清晰的接口。

在两个类间建立友元关系的惟一方法是将第二个类整个声明为第一个类的友元,友元关系不可继承,不可传递,禁止继承友元关系的规定有时并不受欢迎,因为它偶尔会妨碍用户实现某种功能。但是,设想一下,如果允许继承友元关系,那么,用户就有办法单方面攫取访问许可,声明受保护的成员才是允许用户单方面攫取访问许可的机制(对那些显式定义的接口来说)。

我们知道友元关系将把所有访问权限提供给友元类。为了公平起见,两个类应当相互声明对方为友元。

由此可见,友元机制虽然在一定程度上破坏了数据的封装性,但是对于整个C++语言来说,却是使得C++的类更加鲜活。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: