C++友元函数
Bright-SKY 人气:0友元函数 可以直接操作类的私有数据。
friend关键字在声明处修饰函数 那么该函数就是类的友元。
友元 不是类的一部分。
友元概述
c++允许 友元 访问 私有数据。
友元的语法:
friend关键字只出现在声明处 其他类、类成员函数、全局函数都可声明为友元 友元函数不是类的成员,不带this指针 友元函数可访问对象任意成员属性,包括私有属性。
普通全局函数作为类的友元
//房间类 class Room { //将goodGayVisit作为类的友元函数 //goodGayVisit 访问 类中所有数据 但是 它不是类的成员 friend void goodGayVisit(Room &room); private: string bedRoom;//卧室 public: string sittingRoom;//客厅 public: Room() { this->bedRoom = "卧室"; this->sittingRoom="客厅"; } }; // 普通全局函数 作为 类的友元 //好基友 访问 我的房间 void goodGayVisit(Room &room) { cout<<"好基友访问了你的"<<room.sittingRoom<<endl; cout<<"好基友访问了你的"<<room.bedRoom<<endl;//ok } void test01() { Room myRoom; goodGayVisit(myRoom); }
运行结果:
类的某个成员函数作为另一个类的友元
问题1:
问题2:
成员函数内 不能访问 Room的私有数据
最终代码:
#include <iostream> using namespace std; class Room;//Room向前声明 class GoodGay { public: void visit1(Room &room);//此处的Room 被上方 class Room void visit2(Room &room); }; class Room { //如果想方 visit2作为Room类的友元 那么Visit2就可以访问 Room的私有数据 //一定要记得 加类作用域 friend void GoodGay::visit2(Room &room); private: string bedRoom;//卧室 public: string sittingRoom;//客厅 public: Room() { this->bedRoom = "卧室"; this->sittingRoom="客厅"; } }; void GoodGay::visit1(Room &room) { cout<<"好基友visit1访问了你的"<<room.sittingRoom<<endl; //cout<<"好基友visit1访问了你的"<<room.bedRoom<<endl;//不能访问 Room私有数据 } void GoodGay::visit2(Room &room) { cout<<"好基友visit2访问了你的"<<room.sittingRoom<<endl; cout<<"好基友visit2访问了你的"<<room.bedRoom<<endl; } int main(int argc, char *argv[]) { Room myRoom; GoodGay goodGay; goodGay.visit1(myRoom);//只能访问客厅 goodGay.visit2(myRoom);//客厅 卧室 都可以访问 return 0; }
运行结果:
一个类整体作为另一个类的友元
一个类的所有成员函数 访问 另一个类的私有数据
#include <iostream> using namespace std; class Room;//Room向前声明 class GoodGay { public: void visit1(Room &room);//此处的Room 被上方 class Room void visit2(Room &room); }; class Room { //将GoodGay作为Room的友元 //GoodGay 所有成员函数 都可以访问 Room私有数据 friend class GoodGay; private: string bedRoom;//卧室 public: string sittingRoom;//客厅 public: Room() { this->bedRoom = "卧室"; this->sittingRoom="客厅"; } }; void GoodGay::visit1(Room &room) { cout<<"好基友visit1访问了你的"<<room.sittingRoom<<endl; cout<<"好基友visit1访问了你的"<<room.bedRoom<<endl; } void GoodGay::visit2(Room &room) { cout<<"好基友visit2访问了你的"<<room.sittingRoom<<endl; cout<<"好基友visit2访问了你的"<<room.bedRoom<<endl; } int main(int argc, char *argv[]) { Room myRoom; GoodGay goodGay; goodGay.visit1(myRoom); goodGay.visit2(myRoom); return 0; }
运行结果:
友元的注意事项
1.友元关系不能被继承。
2.友元关系是单向的,类A是类B的朋友,但类B不一定是类A 的朋友。
3.友元关系不具有传递性。类B是类A的朋友,类C是类B的朋友,但类C不一定是类A的朋 友
封装电视机 和遥控器的类
1、封装电视机的类
class TV { enum{ On,Off }; //电视状态 enum{ minVol,maxVol = 100 }; //音量从0到100 enum{ minChannel = 1,maxChannel = 255 }; //频道从1到255 private: int mState; //电视状态,开机,还是关机 int mVolume; //电视机音量 int mChannel; //电视频道 public: TV() { this->mState = Off;//默认关机 this->mVolume = minVol; this->mChannel = minChannel; } void onOrOff(void) { this->mState = (this->mState == On ? Off:On); } //加大音量 void volumeUp(void) { if(this->mVolume >= maxVol) return; this->mVolume++; } //减小音量 void volumeDown(void) { if(this->mVolume <= minVol) return; this->mVolume--; } //增加频道 void channelUp(void) { if(this->mChannel >= maxChannel) return; this->mChannel++; } //减小频道 void channelDown(void) { if(this->mChannel <= minChannel) return; this->mChannel--; } //显示电视机的状态 void showTVState(void) { cout<<"电视机的状态为:"<< (this->mState==On ? "开机":"关机") <<endl; cout<<"电视机的音量:"<<this->mVolume<<endl; cout<<"电视机的频道:"<<this->mChannel<<endl; } }; void test01() { TV tv; tv.onOrOff();//开机 tv.volumeUp();//调四次音量 tv.volumeUp(); tv.volumeUp(); tv.volumeUp(); tv.channelUp();//调三次频道 tv.channelUp(); tv.showTVState(); }
运行结果:
2、设置遥控器的类2-1
class TV { friend class Remote; //默认为私有 enum{ On,Off }; //电视状态 enum{ minVol,maxVol = 100 }; //音量从0到100 enum{ minChannel = 1,maxChannel = 255 }; //频道从1到255 private: int mState; //电视状态,开机,还是关机 int mVolume; //电视机音量 int mChannel; //电视频道 public: TV() { this->mState = Off;//默认关机 this->mVolume = minVol; this->mChannel = minChannel; } void onOrOff(void) { this->mState = (this->mState == On ? Off:On); } //加大音量 void volumeUp(void) { if(this->mVolume >= maxVol) return; this->mVolume++; } //减小音量 void volumeDown(void) { if(this->mVolume <= minVol) return; this->mVolume--; } //增加频道 void channelUp(void) { if(this->mChannel >= maxChannel) return; this->mChannel++; } //减小频道 void channelDown(void) { if(this->mChannel <= minChannel) return; this->mChannel--; } //显示电视机的状态 void showTVState(void) { cout<<"电视机的状态为:"<< (this->mState==On ? "开机":"关机") <<endl; cout<<"电视机的音量:"<<this->mVolume<<endl; cout<<"电视机的频道:"<<this->mChannel<<endl; } }; //遥控器类 class Remote { private: TV *pTv; public: Remote(TV *pTv) { this->pTv = pTv; } //音量的加减 void volumeUp(void) { //调节的电视机的音量 this->pTv->volumeUp(); } void volumeDown(void) { this->pTv->volumeDown(); } //频道的加减 void channelUp(void) { this->pTv->channelUp(); } void channelDown(void) { this->pTv->channelDown(); } //电视开关 void onOrOff(void) { this->pTv->onOrOff(); } //遥控器设置频道设置 void setChannel(int num) { //判断 频道 是否有效 if(num >= TV::minChannel && num<= TV::maxChannel ) { this->pTv->mChannel = num; } } void showTVState(void) { this->pTv->showTVState(); } }; void test02() { TV tv; Remote remote(&tv); remote.onOrOff(); remote.volumeUp(); remote.volumeUp(); remote.volumeUp(); remote.volumeUp(); remote.channelUp(); remote.channelUp(); remote.showTVState(); remote.setChannel(75); remote.showTVState(); }
运行结果:
加载全部内容