博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++中友元类使用场合
阅读量:6940 次
发布时间:2019-06-27

本文共 1839 字,大约阅读时间需要 6 分钟。

在C++中我们可以將函数定义成类的友元函数,这样在函数中就可以访问类的私有成员。与函数相同,类也可以作为另一个类的友元类,在友元类中可以访问另外一个类的所有成员。

声明友元类的方法很简单,只需在类中写下如下语句:

friend class 类名;

接下来我们看一个案例,假如我们需要设计一个模拟电视机和遥控器的程序,代码如下。

#include 
using namespace std;class TV{private: enum{on,off}; enum{minvol,maxvol=100}; enum{minchn,maxchn=40}; bool on_off; int volume; int channel;public: TV():on_off(off),volume(20),channel(3){}; //打印属性 void print_tv_info() { cout<<"on_off:"<
<
t.minvol) { t.volume--; return true; } return false;}bool TVController::channel_up(TV& t){ if(t.channel < t.maxchn) { t.channel ++; return true; } return false;}bool TVController::channel_down(TV& t){ if(t.channel > t.minchn) { t.channel --; return true; } return false;}int main(int argc,char* argv[]) { TV mytv; TVController ctl; ctl.set_status(mytv); ctl.volume_down(mytv); ctl.channel_up(mytv); mytv.print_tv_info(); return 0;}

我们定义了一个TV类和TVController分别表示电视机和遥控器。在电视机类有一些常用的属性,如:开关、频道、音量。我们分别用on_off、volume、channel变量表示;在遥控器类(TVController)中我们声明了以下方法来控制电视类:

//开关电视机    void set_status(TV& t){t.on_off = (t.on_off == t.on ? t.off : t.on);}    //增大音量    bool volume_up(TV& t);    //减小音量    bool volume_down(TV& t);    //加频道    bool channel_up(TV& t);    //减频道    bool channel_down(TV& t);

在这些方法中我们都需要访问TV类的成员变量,有两种方法,第一种是把TV类的成员变量都声明为public,但是这种做法显然不符合面向对象编程理念的。另一种是为每个属性增加set,get方法(例如:set_channel,get_channel),TVController类中对TV类的属性访问比较频繁,这样做代码会显得特别冗余,逻辑也不直观。

这时我们就需要將TVController类声明为TV类的友元类,具体做法是在TV类的声明中添加友元类的声明语句:

friend class TVController;

在main函数中我们定义TV类的对象mytv初始值为{on_off:1,volume:20,channel:5}和TVController 类的对象ctl,通过ctl对象的方法改变mytv对象的属性值。

执行程序输出:

on_off:0volume:19channel:4

转载于:https://www.cnblogs.com/lanzhi/p/6468991.html

你可能感兴趣的文章
Java 多线程(三)—— 线程的生命周期及方法
查看>>
AngularJS学习总结
查看>>
MapReduce实现两表join
查看>>
怎么样去优化我们的SQL语句
查看>>
Java 代理模式(一) 静态代理
查看>>
应用缓存
查看>>
【二分答案】【最大流】bzoj1305 [CQOI2009]dance跳舞
查看>>
【AC自动机】【矩阵乘法】【等比数列】hdu2243 考研路茫茫——单词情结
查看>>
【动态规划】bzoj1270 [BeijingWc2008]雷涛的小猫
查看>>
Centos中IP与DNS手动设置方法
查看>>
ISO镜像安装UbuntuKylin 13.04 64位,启动菜单制作实例
查看>>
安装包制作工具 SetupFactory 详解
查看>>
HDU 1232 - 畅通工程
查看>>
【BZOJ】3224: Tyvj 1728 普通平衡树
查看>>
微服务之swagger
查看>>
Redis数据库
查看>>
html5 Canvas绘制图形入门详解
查看>>
ASP.NET 5中的静态文件处理
查看>>
Queue的简单实现
查看>>
js数组转字符串
查看>>