C++ Primer 学习笔记_29_类与数据抽象(11)_友元函数和友元类
#include <math.h> #include <iostream> using namespace std; class Point { friend double Distance(const Point &p1, const Point &p2); public: Point(int x, int y); private: int x_; int y_; }; Point::Point(int x, int y) : x_(x), y_(y) { } double Distance(const Point &p1, const Point &p2) { double dx = p1.x_ - p2.x_; double dy = p1.y_ - p2.y_; return sqrt(dx * dx + dy * dy); } int main(void) { Point p1(3, 4); Point p2(6, 9); cout << Distance(p1, p2) << endl; return 0; }
解释:程序中Distance()函数是Point类的友元函数,可以访问类的私有数据成员。
friend class 类名;
6、示例————一个电视机与遥控的例子
//TeleController.h #ifndef _TELE_CONTROLLER_H_ #define _TELE_CONTROLLER_H_ class Television; //用前向声明就可以不用包含Television.h class TeleController { public: void VolumeUp(Television &tv); //控制电视机的音量 void VolumeDown(Television &tv); void ChanelUp(Television &tv); //控制电视机的频道 void ChanelDown(Television &tv); }; #endif // _TELE_CONTROLLER_H_
//TeleController.cpp #include "TeleController.h" #include "Television.h" //使得Television这个类可见 void TeleController::VolumeUp(Television &tv) { tv.volume_ += 1; } void TeleController::VolumeDown(Television &tv) { tv.volume_ -= 1; } void TeleController::ChanelUp(Television &tv) { tv.chanel_ += 1; } void TeleController::ChanelDown(Television &tv) { tv.volume_ -= 1; }
//Television.h #ifndef _TELEVISION_H_ #define _TELEVISION_H_ class TeleController; //用前向声明就可以不用包含TeleController.h class Television { friend class TeleController; //由于TeleController中的函数要调用Television的私有成员,则声明为友元类 public: Television(int volume, int chanel); private: int volume_; int chanel_; }; #endif // _TELEVISION_H_
//Television.cpp #include "Television.h" Television::Television(int volume, int chanel) : volume_(volume), chanel_(chanel) { }
//main.cpp #include "Television.h" #include "TeleController.h" #include <iostream> using namespace std; int main(void) { Television tv(1, 1); TeleController tc; tc.VolumeUp(tv); return 0; }
解释:将TeleController 类作为Television类的友元类,这样TeleController 类的成员函数就都可以访问Television类的所有成员,包括私有。
参考:
C++ primer 第四版