目录
知识点1【友元概述】
知识点2【普通全局函数 作为 类的友元】
知识点3【类的某个成员函数 作为 另一个类的友元】
知识点3【一个类整体 作为 另一个类的友元】
知识点4【友元的注意事项】
知识点5【封装电视机 和遥控器的类】
1、封装电视机的类
2、设置遥控器的类2-1
友元函数 可以直接操作类的私有数据。
friend关键字在声明处修饰函数 那么该函数就是类的友元。
友元 不是类的一部分。
知识点1【友元概述】
c++允许 友元 访问 私有数据。
友元的语法:
friend关键字只出现在声明处 其他类、类成员函数、全局函数都可声明为友元 友元函数不是类的成员,不带this指针 友元函数可访问对象任意成员属性,包括私有属性。
知识点2【普通全局函数 作为 类的友元】
//房间类
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<<"好基友访问了你的"<
运行结果:
知识点3【类的某个成员函数 作为 另一个类的友元】
问题1:
问题2:
成员函数内 不能访问 Room的私有数据
最终代码:
#include
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访问了你的"<
运行结果:
知识点4【一个类整体 作为 另一个类的友元】
一个类的所有成员函数 访问 另一个类的私有数据
#include
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访问了你的"<
运行结果:
知识点5【友元的注意事项】
1.友元关系不能被继承。
2.友元关系是单向的,类A是类B的朋友,但类B不一定是类A 的朋友。
3.友元关系不具有传递性。类B是类A的朋友,类C是类B的朋友,但类C不一定是类A的朋 友
知识点6【封装电视机 和遥控器的类】
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 ? "开机":"关机") <mVolume<mChannel<
运行结果:
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 ? "开机":"关机") <mVolume<mChannel<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();
}
运行结果:
运行结果:
知识点3【类的某个成员函数 作为 另一个类的友元】
问题1:
问题2:
成员函数内 不能访问 Room的私有数据
最终代码:
#includeusing 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访问了你的"< 运行结果:
知识点4【一个类整体 作为 另一个类的友元】
一个类的所有成员函数 访问 另一个类的私有数据
#includeusing 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访问了你的"< 运行结果:
知识点5【友元的注意事项】
1.友元关系不能被继承。
2.友元关系是单向的,类A是类B的朋友,但类B不一定是类A 的朋友。
3.友元关系不具有传递性。类B是类A的朋友,类C是类B的朋友,但类C不一定是类A的朋 友
知识点6【封装电视机 和遥控器的类】
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 ? "开机":"关机") <mVolume< mChannel< 运行结果:
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 ? "开机":"关机") <mVolume< mChannel< 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(); } 运行结果:



