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

转载 2016年08月30日 14:47:16

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

      当一个类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类中的私有成员。下面,是该程序的输出:


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

举报

相关文章推荐

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

C++之“友元类”学习笔记 =======================什么是友元类=======================       当一个类B成为了另外一个类...

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

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

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

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

一、运算符重载

C++之操作符重载和友元学习笔记

用户定义的多个名称相同但特征标(参数列表)不同的函数,这被称为函数重载或函数多态。目的是让您能够用相同的函数来完成相同的基本操作,即使这种操作被用于不同的数据类型。     要重载操作符,需要使用被称...

《C++ primer plus》第十五章:友元、异常与其他 学习笔记

《C++ primer plus》第十五章:友元、异常与其他

C++ Primer 学习笔记 — 友元

友元机制允许一个类将对其非公有成员的访问权授予指定的函数或者类。友元的声明以关键字friend开始,只能出现在类定义的内部,友元的声明可以出现在类内部的任何地方。通常,将友元成组地放在类的开始或者结尾...

【C++】学习笔记五十二——友元

友元友元有三种: 友元函数; 友元类; 友元成员函数。 通过让函数成为类的友元,可以赋予该函数与类的成员函数相同的访问权限。创建友元创建友元函数的第一步是将其原型放在类声明中,并在原型声明前加上关键字...

【C++】【学习笔记】【020】友元

1、有些时候,一个完全无关的类由于某些特殊的原因需要访问某个protected成员,甚至某个private成员,这就引入了友元的概念; 2、友元关系是类之间的一种特殊关系,这种关系不仅允许友元类访问...

c++学习笔记 友元函数与友元类s

声明:代码出处http://www.weixueyuan.net/view/6350.html 通过friend关键字,我们可以将不属于当前类的一个函数在当前类中加以声明,该函数便可以成为当...

c++学习笔记 类运算符重载与友元与类型转换

有这样一个类: class Str { char str[100]; int n; public: Str(const char *pstr = "\0"){ strcpy(str, ps...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)