C++实例代码详解友元函数_第1页
C++实例代码详解友元函数_第2页
C++实例代码详解友元函数_第3页
C++实例代码详解友元函数_第4页
C++实例代码详解友元函数_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第C++实例代码详解友元函数目录友元概述普通全局函数作为类的友元类的某个成员函数作为另一个类的友元一个类整体作为另一个类的友元友元的注意事项封装电视机和遥控器的类友元函数可以直接操作类的私有数据。

friend关键字在声明处修饰函数那么该函数就是类的友元。

友元不是类的一部分。

友元概述

c++允许友元访问私有数据。

友元的语法:

friend关键字只出现在声明处其他类、类成员函数、全局函数都可声明为友元友元函数不是类的成员,不带this指针友元函数可访问对象任意成员属性,包括私有属性。

普通全局函数作为类的友元

//房间类

classRoom

//将goodGayVisit作为类的友元函数

//goodGayVisit访问类中所有数据但是它不是类的成员

friendvoidgoodGayVisit(Roomroom);

private:

stringbedRoom;//卧室

public:

stringsittingRoom;//客厅

public:

Room()

this-bedRoom="卧室";

this-sittingRoom="客厅";

//普通全局函数作为类的友元

//好基友访问我的房间

voidgoodGayVisit(Roomroom)

cout"好基友访问了你的"room.sittingRoomendl;

cout"好基友访问了你的"room.bedRoomendl;//ok

voidtest01()

RoommyRoom;

goodGayVisit(myRoom);

}

运行结果:

类的某个成员函数作为另一个类的友元

问题1:

问题2:

成员函数内不能访问Room的私有数据

最终代码:

#includeiostream

usingnamespacestd;

classRoom;//Room向前声明

classGoodGay

public:

voidvisit1(Roomroom);//此处的Room被上方classRoom

voidvisit2(Roomroom);

classRoom

//如果想方visit2作为Room类的友元那么Visit2就可以访问Room的私有数据

//一定要记得加类作用域

friendvoidGoodGay::visit2(Roomroom);

private:

stringbedRoom;//卧室

public:

stringsittingRoom;//客厅

public:

Room()

this-bedRoom="卧室";

this-sittingRoom="客厅";

voidGoodGay::visit1(Roomroom)

cout"好基友visit1访问了你的"room.sittingRoomendl;

//cout"好基友visit1访问了你的"room.bedRoomendl;//不能访问Room私有数据

voidGoodGay::visit2(Roomroom)

cout"好基友visit2访问了你的"room.sittingRoomendl;

cout"好基友visit2访问了你的"room.bedRoomendl;

intmain(intargc,char*argv[])

RoommyRoom;

GoodGaygoodGay;

goodGay.visit1(myRoom);//只能访问客厅

goodGay.visit2(myRoom);//客厅卧室都可以访问

return0;

}

运行结果:

一个类整体作为另一个类的友元

一个类的所有成员函数访问另一个类的私有数据

#includeiostream

usingnamespacestd;

classRoom;//Room向前声明

classGoodGay

public:

voidvisit1(Roomroom);//此处的Room被上方classRoom

voidvisit2(Roomroom);

classRoom

//将GoodGay作为Room的友元

//GoodGay所有成员函数都可以访问Room私有数据

friendclassGoodGay;

private:

stringbedRoom;//卧室

public:

stringsittingRoom;//客厅

public:

Room()

this-bedRoom="卧室";

this-sittingRoom="客厅";

voidGoodGay::visit1(Roomroom)

cout"好基友visit1访问了你的"room.sittingRoomendl;

cout"好基友visit1访问了你的"room.bedRoomendl;

voidGoodGay::visit2(Roomroom)

cout"好基友visit2访问了你的"room.sittingRoomendl;

cout"好基友visit2访问了你的"room.bedRoomendl;

intmain(intargc,char*argv[])

RoommyRoom;

GoodGaygoodGay;

goodGay.visit1(myRoom);

goodGay.visit2(myRoom);

return0;

}

运行结果:

友元的注意事项

1.友元关系不能被继承。

2.友元关系是单向的,类A是类B的朋友,但类B不一定是类A的朋友。

3.友元关系不具有传递性。类B是类A的朋友,类C是类B的朋友,但类C不一定是类A的朋友

封装电视机和遥控器的类

1、封装电视机的类

classTV

enum{On,Off};//电视状态

enum{minVol,maxVol=100};//音量从0到100

enum{minChannel=1,maxChannel=255};//频道从1到255

private:

intmState;//电视状态,开机,还是关机

intmVolume;//电视机音量

intmChannel;//电视频道

public:

TV()

this-mState=Off;//默认关机

this-mVolume=minVol;

this-mChannel=minChannel;

voidonOrOff(void)

this-mState=(this-mState==OnOff:On);

//加大音量

voidvolumeUp(void)

if(this-mVolume=maxVol)

return;

this-mVolume++;

//减小音量

voidvolumeDown(void)

if(this-mVolume=minVol)

return;

this-mVolume--;

//增加频道

voidchannelUp(void)

if(this-mChannel=maxChannel)

return;

this-mChannel++;

//减小频道

voidchannelDown(void)

if(this-mChannel=minChannel)

return;

this-mChannel--;

//显示电视机的状态

voidshowTVState(void)

cout"电视机的状态为:"(this-mState==On"开机":"关机")endl;

cout"电视机的音量:"this-mVolumeendl;

cout"电视机的频道:"this-mChannelendl;

voidtest01()

TVtv;

tv.onOrOff();//开机

tv.volumeUp();//调四次音量

tv.volumeUp();

tv.volumeUp();

tv.volumeUp();

tv.channelUp();//调三次频道

tv.channelUp();

tv.showTVState();

}

运行结果:

2、设置遥控器的类2-1

classTV

friendclassRemote;

//默认为私有

enum{On,Off};//电视状态

enum{minVol,maxVol=100};//音量从0到100

enum{minChannel=1,maxChannel=255};//频道从1到255

private:

intmState;//电视状态,开机,还是关机

intmVolume;//电视机音量

intmChannel;//电视频道

public:

TV()

this-mState=Off;//默认关机

this-mVolume=minVol;

this-mChannel=minChannel;

voidonOrOff(void)

this-mState=(this-mState==OnOff:On);

//加大音量

voidvolumeUp(void)

if(this-mVolume=maxVol)

return;

this-mVolume++;

//减小音量

voidvolumeDown(void)

if(this-mVolume=minVol)

return;

this-mVolume--;

//增加频道

voidchannelUp(void)

if(this-mChannel=maxChannel)

return;

this-mChannel++;

//减小频道

voidchannelDown(void)

if(this-mChannel=minChannel)

return;

this-mChannel--;

//显示电视机的状态

voidshowTVState(void)

cout"电视机的状态为:"(this-mState==On"开机":"关机")endl;

cout"电视机的音量:"this-mVolumeendl;

cout"电视机的频道:"this-mChannelendl;

//遥控器类

classRemote

private:

TV*pTv;

public:

Remote(TV*pTv)

this-pTv=pTv;

//音量的加减

voidvolumeUp(void)

//调节的电视机的音量

this-pTv-volumeUp();

voidvolumeDown(void)

this-pTv-volumeDown();

//频道的加减

voidchannelUp(void)

this-pTv-channelUp();

voidchannelDown(void)

this-pTv-channelDown();

//电视开关

voidonOrOff(void)

this-pTv-onOrOff();

//遥控器设置频道设置

voidsetChannel(intnum)

//判断频道是否有效

if(num=TV::minChannelnum=TV::maxChannel)

this-pTv-mChannel=num;

voidshowTVState(void)

this-pTv-showTVState();

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论