870920 Menu

SwingCoder之C++备忘录·15

友元关系

类与类之间的关系无外乎聚合、组合、依赖、继承与友元这几种。友元最为特殊,它打破了面向对象的数据封装和信息隐蔽性。不是非常必要的前提下,慎重使用友元函数或友元类。但是,适当使用可以减少编码量并提高代码的执行效率。

B类的类定义中声明A类为自己的友元类:
class B
{
friend class A;
// …
};

如此一来,A类中即可通过B类的对象访问B类的所有成员,包括B类的private成员。友元函数同理,常用于类的运算符重载中(除=、[]、()、->之外,其他运算符皆可声明为全局性的函数,此时需在类内将重载的运算符函数声明为友元函数)。友元声明忽略public、protected、private访问权限标识符,因此,友元声明语句可位于类中的任意位置。建议在类定义的最开始处,或private区的最开始处声明友元。

友元关系既不对称,也不传递,更不能继承。另外,如果某个函数有多个重载版本,并且打算将这些函数声明为类的友元函数,则该函数的每一个重载版本均需进行友元声明。

何时使用友元:如果两个类(或类与某个函数)之间存在强烈的耦合与大量的通信,而且性能受到了这种通信的影响,则尝试使用友元机制。将一个大类分割为两个或多个小类后,有时也需使用友元来简化编程(此时可将这些类的类定义写在同一个头文件中,以示其耦合性与模块性)。

关于友元的另外一些须知:友元函数没有this指针。尽量不要在类模板和函数模板中使用友元。