概述
友元提供了一种普通函数或者类成员函数访问另一个类中的私有或保护成员的机制。也就是说有两种形式的友元:
- 友元函数
- 友元类
特性
优点:提高了程序的运行效率。
缺点:破坏了类的封装性和数据的透明性。
实现
-
友元函数
-
声明和定义
在类声明的任何区域内声明,而定义则在类的外部。
friend <类型><友元函数名>(<参数表>);
注意,友元函数只是一个普通函数,并不是该类的类成员函数,它可以在任何地方调用,友元函数中通过对象名来访问该类的私有或保护成员。
-
示例
#include "stdafx.h" class A{ public: A(int _a): a(_a){}; friend int getA_a(A &_classA); //友元函数 private: int a; }; int getA_a(A &_classA){ return _classA.a; } int _tmain(int argc, _TCHAR* argv[]) { A _classA(3); std::cout << getA_a(_classA); //友元函数只是普通函数,可以在任何地方调用 return 0; }
-
-
友元类
注意
- 友元关系没有继承性
假如类B是类A的友元,类C继承于类A,那么友元类B是没办法直接访问类C的私有或保护成员。
- 友元关系没有传递性
加入类B是类A的友元,类C是类B的友元,那么友元类C是没办法直接访问类A的私有或保护成员,也就是不存在“友元的友元”这种关系。