文章目录
- 参考
- 友元类
- 友元成员函数
- 其他友元关系?
参考
- 《C++ Primer Plus》第15章:友元、异常和其他
- 菜鸟教程
类的友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员。尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数。
友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类,在这种情况下,整个类及其所有成员都是友元。
友元类
什么时候希望一个类成为另一个类的友元?
假定是编写一个模拟电视机(Tv类)和遥控器(Remote类)的简单程序。
这两个类之间应该存在某种关系,但不是is-a, has-a 的关系。遥控器可以改变电视机的状态,Remote 类可以作为 Tv 类的一个友元。
友元类声明可以在公有、私有或保护部分。
#ifdef TV_H_
#define TV_H_class Tv :
{
public:friend cass Remote;//Remote canacenum (off, On);enum(MinVal, MaxVal 20);enum(Antenna, Cable);enum(TV, DVD);
private:int state; //on or offint volume; //assumed to be digitizedint maxchannel; //maximum number of channelsint channel; //current channel settingint mode; //broadcast or cable
};class Remote {
private:int mode;
public:Remote(int m = Tv::TV) :mode(m) {};bool volup(Tv& t) { return t.volup(); }bool voldown(Tv& t) { return t.voldown(); }
};#endif //
友元成员函数
也可以直接声明某成员函数为友元
#include <iostream>using namespace std;class Box
{double width;
public:friend void printWidth( Box box );void setWidth( double wid );
};// 成员函数定义
void Box::setWidth( double wid )
{width = wid;
}// 请注意:printWidth() 不是任何类的成员函数
void printWidth( Box box )
{/* 因为 printWidth() 是 Box 的友元,它可以直接访问该类的任何成员 */cout << "Width of box : " << box.width <<endl;
}// 程序的主函数
int main( )
{Box box;// 使用成员函数设置宽度box.setWidth(10.0);// 使用友元函数输出宽度printWidth( box );return 0;
}
其他友元关系?
2022-11-21 v1