Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1812|回复: 0
打印 上一主题 下一主题

C++之“友元类”学习笔记

[复制链接]

1228

主题

1998

帖子

7598

积分

认证用户组

Rank: 5Rank: 5

积分
7598
跳转到指定楼层
楼主
发表于 2017-2-9 14:11:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
http://www.cnblogs.com/uniqueliu/archive/2011/08/02/2125590.html
=======================什么是友元类=======================
      当一个类B成为了另外一个类A的“朋友”时,那么类A的私有和保护的数据成员就可以被类B访问。我们就把类B叫做类A的友元。
=======================友元类能做什么=======================
      友元类可以通过自己的方法来访问把它当做朋友的那个类的所有成员。但是我们应该注意的是,我们把类B设置成了类A的友元类,但是这并不会是类A成为类B的友元。说白了就是:甲愿意把甲的秘密告诉乙,但是乙不见得愿意把乙自己的秘密告诉甲。
=======================友元类的声明方法和其用法=======================
      声明友元类的方法其实很简单,只要我们在类A的成员列表中写下如下语句:
  1. friend class B;
复制代码

  这样一来,类B就被声明成了类A的友元。注意,类B虽然是类A的友元,但是两者之间不存在继承关系。这也就是说,友元类和原来那个类之间并没有什么继承关系,也不存在包含或者是被包含的关系,友元类和我上一篇博文《谈谈:C++类的“包含”机制》中的包含是完全不一样的!
=======================友元类的一个具体例子=======================
      在这里,我们引用一个我从网上收集到的例子来说明友元类的作用:假设我们要设计一个模拟电视机和遥控器的程序。大家都之道,遥控机类和电视机类是不相包含的,而且,遥控器可以操作电视机,但是电视机无法操作遥控器,这就比较符合友元的特性了。即我们把遥控器类说明成电视机类的友元。下面是这个例子的具体代码:
  1. #include <iostream>
  2. using namespace std;
  3. class TV
  4. {
  5.     public:
  6.       friend class Tele;
  7.       TV():on_off(off),volume(20),channel(3),mode(tv){}
  8.     private:   
  9.       enum{on,off};
  10.       enum{tv,av};
  11.       enum{minve,maxve=100};
  12.       enum{mincl,maxcl=60};
  13.       bool on_off;
  14.       int  volume;
  15.       int channel;
  16.       int mode;
  17. };
  18. class Tele
  19. {
  20.     public:
  21.        void OnOFF(TV&t){t.on_off=(t.on_off==t.on)?t.off:t.on;}
  22.        void SetMode(TV&t){t.mode=(t.mode==t.tv)?t.av:t.tv;}
  23.        bool VolumeUp(TV&t);
  24.        bool VolumeDown(TV&t);
  25.        bool ChannelUp(TV&t);
  26.        bool ChannelDown(TV&t);
  27.        void show(TV&t)const;   
  28. };
  29. bool Tele::VolumeUp(TV&t)
  30. {
  31.     if (t.volume<t.maxve)
  32.     {
  33.         t.volume++;
  34.         return true;
  35.     }
  36.     else
  37.     {
  38.         return false;
  39.     }
  40. }
  41. bool Tele::VolumeDown(TV&t)
  42. {
  43.     if (t.volume>t.minve)
  44.     {
  45.         t.volume--;
  46.         return true;
  47.     }
  48.     else
  49.     {
  50.         return false;
  51.     }
  52. }
  53. bool Tele::ChannelUp(TV&t)
  54. {
  55.     if (t.channel<t.maxcl)
  56.     {
  57.         t.channel++;
  58.         return true;
  59.     }
  60.     else
  61.     {
  62.         return false;
  63.     }
  64. }
  65. bool Tele::ChannelDown(TV&t)
  66. {
  67.     if (t.channel>t.mincl)
  68.     {
  69.         t.channel--;
  70.         return true;
  71.     }
  72.     else
  73.     {
  74.         return false;
  75.     }
  76. }
  77. void Tele::show(TV&t)const
  78. {
  79.     if (t.on_off==t.on)
  80.     {
  81.         cout<<"电视现在"<<(t.on_off==t.on?"开启":"关闭")<<endl;
  82.         cout<<"音量大小为:"<<t.volume<<endl;
  83.         cout<<"信号接收模式为:"<<(t.mode==t.av?"AV":"TV")<<endl;
  84.         cout<<"频道为:"<<t.channel<<endl;

  85.     }
  86.     else
  87.     {
  88.         cout<<"电视现在"<<(t.on_off==t.on?"开启":"关闭")<<endl;
  89.     }
  90.      
  91. }
  92. int main()
  93. {
  94.     Tele t1;
  95.     TV t2;
  96.     t1.show(t2);
  97.     t1.OnOFF(t2);
  98.     t1.show(t2);
  99.     cout<<"调大声音"<<endl;
  100.     t1.VolumeUp(t2);
  101.     cout<<"频道+1"<<endl;
  102.     t1.ChannelUp(t2);
  103.     cout<<"转换模式"<<endl;
  104.     t1.SetMode(t2);
  105.     t1.show(t2);
  106.     return 0;
  107. }
复制代码
我们在程序的第6行定义了一个TV电视机类的友元类Tele。那么程序中就可以来调用TV类中的私有成员。下面,是该程序的输出:
      好了,这就是友元类了。关于友元类,我反正是这样认为的,因为友元类有可能会破坏数据的安全性,我们还是少用为好啊!在这里我只是记录一下它的用法罢了,呵呵

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|firemail ( 粤ICP备15085507号-1 )

GMT+8, 2024-5-18 00:23 , Processed in 0.054764 second(s), 19 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表