C++类除了成员函数,静态成员函数,还有一种函数:友元函数。
友元函数和类一种朋友关系,它不属于类,但可以访问类的私有成员,它和类是一种朋友关系,也不需要用类的对象去驱动,例如下面的代码:
#includeusing namespace std; class ASD{ friend int getData(const ASD& asd); private: int m_Value; public: ASD(int value = 0):m_Value(value){} ~ASD(){} }; int getData(const ASD& asd) { return asd.m_Value; } int main() { ASD obj(123); cout << "m_Value = " << getData(obj) << endl; return 0; }
getData是类ASD的友元函数,在大括号里声明,在外面定义,不需要作用域限定符,调用的时候就和全局函数一样的调用。
友元函数经常应用于运算符重载。例如下面的代码,实现数和对象相加
#includeusing namespace std; class Fushu { friend Fushu operator+(int i, const Fushu& fu); private: int m_Real; int m_Xu; public: Fushu(int real, int xu) { m_Real = real; m_Xu = xu; } int getReal() { return m_Real; } int getXu() { return m_Xu; } }; Fushu operator+(int i, const Fushu& fu) { int real = i + fu.m_Real; int xu = fu.m_Xu; return Fushu(real, xu); } int main() { Fushu f1(3, -2); Fushu f2 = 4 + f1; cout << f2.getReal() << f2.getXu() << "i" << endl; return 0; }
友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的隐藏信息(包括私有成员和保护成员)。当希望一个类可以存取另一个类的私有成员时,可以将该类声明为另一类的友元类。
关于友元类的注意事项:
(1) 友元关系不能被继承。
(2) 友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。
(3) 友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的申明。
代码如下:
#includeusing namespace std; class A { friend class C; //这是友元类的声明, C是A的友元类 private: int data; }; class C //友元类定义,为了访问类A中的成员 { public: void show(int x, A& a) { a.data = x; cout << a.data << endl; } }; int main(void) { class A a; class C c; c.show(1, a); //C的对象访问A的成员 return 0; }
总结:友元可以访问类的私有属性,但破坏了类的封装性。