- 场景
- 在C++中,我们使用类对数据进行了隐藏和封装,类的数据成员一般都定义为私有成员,成员函数一般都定义为公有的,以此提供类与外界的通讯接口。但是,有时需要定义一些函数,这些函数不是类的一部分,但又需要频繁地访问类的数据成员,这时可以将这些函数定义为该函数的友元函数。除了友元函数外,还有友元类,两者统称为友元。
- 利弊
- 友元的作用是提高了程序的运行效率(即减少了类型检查和安全性检查等都需要时间开销),但它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。
- 友元函数
-
在定义一个类的时候,可以把一些函数(包括全局函数和其他类的成员函数)声明为“友元”,这样那些函数就成为该类的友元函数,在友元函数内部就可以访问该类对象的私有成员了。
-
将全局函数声明为友元的写法如下:
friend 返回值类型 函数名(参数表); -
将其他类的成员函数声明为友元的写法如下:
friend 返回值类型 其他类的类名::成员函数名(参数表); -
但是,不能把其他类的私有成员函数声明为友元。
-
- 友元类
-
一个类 A 可以将另一个类 B 声明为自己的友元,类 B 的所有成员函数就都可以访问类 A 对象的私有成员。在类定义中声明友元类的写法如下:
friend class 类名; -
示例
class CCar { private: int price; friend class CDriver; //声明 CDriver 为友元类 }; class CDriver { public: CCar myCar; void ModifyCar() //改装汽车 { myCar.price += 1000; //因CDriver是CCar的友元类,故此处可以访问其私有成员 } }; int main() { return 0; } -
友元关系在类之间不能传递,即类 A 是类 B 的友元,类 B 是类 C 的友元,并不能导出类 A 是类 C 的友元。
-