关闭

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

标签: c++友元类
166人阅读 评论(0) 收藏 举报
分类:

=======================什么是友元类=======================

      当一个类B成为了另外一个类A的“朋友”时,那么类A的私有和保护的数据成员就可以被类B访问。我们就把类B叫做类A的友元。

=======================友元类能做什么=======================

      友元类可以通过自己的方法来访问把它当做朋友的那个类的所有成员。但是我们应该注意的是,我们把类B设置成了类A的友元类,但是这并不会是类A成为类B的友元。说白了就是:甲愿意把甲的秘密告诉乙,但是乙不见得愿意把乙自己的秘密告诉甲。

=======================友元类的声明方法和其用法=======================

      声明友元类的方法其实很简单,只要我们在类A的成员列表中写下如下语句:

friend class B;

  这样一来,类B就被声明成了类A的友元。注意,类B虽然是类A的友元,但是两者之间不存在继承关系。这也就是说,友元类和原来那个类之间并没有什么继承关系,也不存在包含或者是被包含的关系,友元类和我上一篇博文《谈谈:C++类的“包含”机制》中的包含是完全不一样的!

=======================友元类的一个具体例子=======================

      在这里,我们引用一个我从网上收集到的例子来说明友元类的作用:假设我们要设计一个模拟电视机和遥控器的程序。大家都之道,遥控机类和电视机类是不相包含的,而且,遥控器可以操作电视机,但是电视机无法操作遥控器,这就比较符合友元的特性了。即我们把遥控器类说明成电视机类的友元。下面是这个例子的具体代码:

#include <iostream>
using namespace std;
class TV 
{
    public:
      friend class Tele;
      TV():on_off(off),volume(20),channel(3),mode(tv){}
    private:    
      enum{on,off};
      enum{tv,av};
      enum{minve,maxve=100};
      enum{mincl,maxcl=60};
      bool on_off;
      int  volume;
      int channel;
      int mode;
};
class Tele
{
    public:
       void OnOFF(TV&t){t.on_off=(t.on_off==t.on)?t.off:t.on;}
       void SetMode(TV&t){t.mode=(t.mode==t.tv)?t.av:t.tv;}
       bool VolumeUp(TV&t);
       bool VolumeDown(TV&t);
       bool ChannelUp(TV&t);
       bool ChannelDown(TV&t);
       void show(TV&t)const;    
};
bool Tele::VolumeUp(TV&t)
{
    if (t.volume<t.maxve)
    {
        t.volume++;
        return true;
    } 
    else
    {
        return false;
    }
}
bool Tele::VolumeDown(TV&t)
{
    if (t.volume>t.minve)
    {
        t.volume--;
        return true;
    } 
    else
    {
        return false;
    }
}
bool Tele::ChannelUp(TV&t)
{
    if (t.channel<t.maxcl)
    {
        t.channel++;
        return true;
    } 
    else
    {
        return false;
    }
}
bool Tele::ChannelDown(TV&t)
{
    if (t.channel>t.mincl)
    {
        t.channel--;
        return true;
    } 
    else
    {
        return false;
    }
}
void Tele::show(TV&t)const
{
    if (t.on_off==t.on)
    {
        cout<<"电视现在"<<(t.on_off==t.on?"开启":"关闭")<<endl;
        cout<<"音量大小为:"<<t.volume<<endl;
        cout<<"信号接收模式为:"<<(t.mode==t.av?"AV":"TV")<<endl;
        cout<<"频道为:"<<t.channel<<endl;
 
    } 
    else
    {
        cout<<"电视现在"<<(t.on_off==t.on?"开启":"关闭")<<endl;
    }
     
}
int main()
{
    Tele t1;
    TV t2;
    t1.show(t2);
    t1.OnOFF(t2);
    t1.show(t2);
    cout<<"调大声音"<<endl;
    t1.VolumeUp(t2);
    cout<<"频道+1"<<endl;
    t1.ChannelUp(t2);
    cout<<"转换模式"<<endl;
    t1.SetMode(t2);
    t1.show(t2);
    return 0;
}

 我们在程序的第6行定义了一个TV电视机类的友元类Tele。那么程序中就可以来调用TV类中的私有成员。下面,是该程序的输出:


好了,这就是友元类了。关于友元类,我反正是这样认为的,因为友元类有可能会破坏数据的安全性,我们还是少用为好啊!在这里我只是记录一下它的用法罢了,呵呵

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

[持续更新]HTML5学习笔记(二)

1.  元素分类 元数据元素(metadata element):由此可见主要是元素中的事情了,向浏览器提供信息和指示; 流元素(flow element):听名字怪异,但是其实是规定这些元素可以...
  • u014267351
  • u014267351
  • 2015-09-01 13:03
  • 1665

《李航:统计学习方法》笔记之感知机

感知机学习旨在求出将训练数据集进行线性划分的分类超平面,为此,导入了基于误分类的损失函数,然后利用梯度下降法对损失函数进行极小化,从而求出感知机模型。感知机模型是神经网络和支持向量机的基础。下面分别从...
  • longzaitianya1989
  • longzaitianya1989
  • 2014-09-24 10:33
  • 6325

C++学习笔记(一) 补充篇 基础语法 — 参考慕课网 值得推荐!

2016年8月23日 前段时间真的是恍然大悟,书看错了,我看的 C++ prime plus看的真心的难受,也不知道这本书到底在写什么。 2016年8月28日 一晃又过了4-5天,真快啊,发现那...
  • David_Han008
  • David_Han008
  • 2016-08-25 16:47
  • 2918

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

=======================什么是友元类=======================       当一个类B成为了另外一个类A的“朋友”时,那么类A的私有和保护的数据成员就可以被...
  • Davis_Chou
  • Davis_Chou
  • 2012-12-01 01:15
  • 318

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

转自:http://www.cnblogs.com/uniqueliu/archive/2011/08/02/2125590.html 谢谢原博主的分享,随喜赞叹! ===========...
  • godbenson
  • godbenson
  • 2014-03-16 11:03
  • 423

C++Primer学习笔记(使用类,友元,类转换)

一、运算符重载
  • u010092734
  • u010092734
  • 2014-10-15 22:14
  • 997

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

C++之“友元类”学习笔记 =======================什么是友元类=======================       当一个类B成为了另外一个类...
  • tianwaikai
  • tianwaikai
  • 2015-03-19 00:12
  • 260

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

=======================什么是友元类=======================       当一个类B成为了另外一个类A的“朋友”时,那么类A的私有和保护的数据成员就可以被...
  • sj19890401
  • sj19890401
  • 2013-11-25 10:42
  • 405

c++ primer 学习笔记:类之友元

友元 友元机制允许一个类将对其非公有成员的访问权授予指定的函数或类。友元的声明以关键字friend 开始。它只能出现在类定义的内部。友元声明可以出现在类中的任何地方:友元不是授予友元关系的那个类的成...
  • longhuaparty
  • longhuaparty
  • 2013-08-24 21:47
  • 542

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

=======================什么是友元类=======================       当一个类B成为了另外一个类A的“朋友”时,那么类A的私有和保护的数据成员就可以被...
  • piaopiaopiaopiaopiao
  • piaopiaopiaopiaopiao
  • 2013-10-04 13:07
  • 513
    个人资料
    • 访问:190688次
    • 积分:3321
    • 等级:
    • 排名:第11841名
    • 原创:94篇
    • 转载:190篇
    • 译文:0篇
    • 评论:21条
    博客专栏
    最新评论