类的重要特性是使数据封装与隐藏,但同时也给外部函数访问类中的私有和保护类型数据成员带来了不便。为此,C++使用了"友元函数"。
一、友元函数
友元函数必须在类中进行声明而在类外定义,声明须在函数类型的前面加上friend关键字,友元函数虽不是类的成员函数,但它可以访问类中的私有和保护类型数据成员。
友元函数的使用:
- #include <iostream>
- using namespace std;
- class CObj
- {
- public:
- CObj() : mX(1), mY(2) {}
- friend void ShowData(CObj obj);
- private:
- int mX;
- int mY;
- };
- void ShowData(CObj obj)
- {
- cout << "mX = " << obj.mX << endl
- << "mY = " << obj.mY << endl;
- }
- int main()
- {
- CObj obj;
- ShowData(obj);
- return 0;
- }
执行结果:
mX = 1
mY = 2
二、友元类
当一个类作为另一个类的友元时,这就意味着该类的所有成员函数都是另一个类的友元函数。
友元类的使用:
- #include <iostream>
- using namespace std;
- class CObj
- {
- public:
- CObj() : mX(0), mY(0) {}
- friend class CFriend;
- private:
- void PrintData() const
- {
- cout << "mX = " << mX << endl
- << "mY = " << mY << endl;
- }
- int mX;
- int mY;
- };
- class CFriend
- {
- public:
- CFriend(int x, int y)
- {
- mObj.mX = x; //直接调用类CObj的私有数据成员
- mObj.mY = y;
- }
- void ShowData() const
- {
- mObj.PrintData(); //直接调用类CObj的私有成员函数
- }
- private:
- CObj mObj;
- };
- int main()
- {
- CFriend one(3, 4);
- one.ShowData();
- return 0;
- }
执行结果:
mX = 3
mY = 4
三、使用其他类的成员函数为友元
这是在《C++ Primer中文版第4版》看到的,声明类的时候可能会出现顺序问题。
- #include <iostream>
- using namespace std;
- class CObj; //提前声明CObj,给CFriend类使用
- class CFriend
- {
- public:
- void ShowData(CObj obj);
- };
- class CObj
- {
- public:
- CObj() : mX(1), mY(2) {}
- friend void CFriend::ShowData(CObj obj);
- private:
- int mX;
- int mY;
- };
- void CFriend::ShowData(CObj obj)
- {
- cout << "mX = " << obj.mX << endl
- << "mY = " << obj.mY << endl;
- }
- int main()
- {
- CObj obj;
- CFriend fobj;
- fobj.ShowData(obj);
- return 0;
- }
执行结果:
mX = 1
mY = 2