c++友元
# 前言
友元实际上并不是面向对象的特征,而是为了兼顾C语言
程序设计的习惯与C++
信息隐藏的特点,而特意增加的功能。这是一种类成员的访问权限。友元的概念破坏了类的封装性和信息隐藏,但有助于数据共享,能够提高程序执行的效率。
面向对象的程序设计要求在类外不能访问类的私有成员变量,而必须通过公有的成员函数来访问。这样的程序设计风格,使得程序在书写上比较麻烦。因为凡是需要访问私有成员变量的地方就需要通过公有成员函数来实现。友元机制
是对一些类外的函数打开的一个特殊通道
,授权它们能够访问本类的私有成员变量。没有提供授权的函数仍然不能直接访问私有成员变量。这样,既保证了信息该隐藏的时候隐藏,又能给一些“可信任”的类和函数提供信息访问的便利性。
友元使用关键词friend标识。在类定义中,当friend出现在函数说明语句的前面时,表示该函数为类的友元函数,一个函数可以同时说明为多个类的友元函数,一个类中也可以有多个友元函数。当friend出现在类名之前时,表示该类为类的友元类。
# 友元函数
在定义一个类的时候,可以把一些函数(包括全局函数和其他类的成员函数)声明为“友元”,这样那些函数就成为本类的友元函数
,在友元函数内部可以直接访问本类对象的私有成员。
在类定义中,将一个全局函数声明为本类友元函数的格式如下:
friend 返回值类型 函数名(参数表);
当有某类A的定义后,将类A的成员函数说明为本类的友元函数的格式如下:
friend 返回值类型 类A::类A的成员函数名(参数表);
# 注意
不能把其他类的私有成员函数声明为友元函数
。
友元函数不是类的成员函数,但允许访问类中的所有成员。在函数体中访问对象成员时,必须使用“对象名.对象成员名”的方式。
友元函数不受类中的访问权限关键词限制,可以把它放在类的公有、私有、保护的部分,结果是一样的。
# 友元类
如果将一个类A说明为另一类B的友元类,则类A中所有的成员函数都是类B的友元函数,在类A的所有成员函数都可以访问类B的所有成员,在类定义中声明友元类的格式如下:
friend class 类名;
# 注意
友元类的关系是单向的,若说明类A是类B的友元类,不等于类B也是类A的友元类。友元类的关系不能传递,即若类A是类B的友元类,而类C是类A的友元类,不等于类C也是类A的友元类。