上学笔记

=======================如何是友元类=======================

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

     
当多少个类B成为了其余2个类A的“朋友”时,那么类A的民用和掩护的多寡成员就足以被类B访问。我们就把类B叫做类A的友元。

     
当一个类B成为了其它1个类A的“朋友”时,那么类A的私人住房和保障的数量成员就足以被类B访问。大家就把类B叫做类A的友元。

=======================友元类能做如何=======================

=======================友元类能做哪些=======================

     
友元类能够由此协调的艺术来拜访把它当做朋友的非凡类的保有成员。但是大家相应专注的是,大家把类B设置成了类A的友元类,不过那并不会是类A成为类B的友元。说白了便是:甲愿意把甲的神秘告诉乙,不过乙不见得愿意把乙自身的潜在告诉甲。

     
友元类能够因而友好的办法来拜访把它看作朋友的尤其类的享有成员。但是大家相应专注的是,大家把类B设置成了类A的友元类,不过那并不会是类A成为类B的友元。说白了正是:甲愿意把甲的私人住房告诉乙,可是乙不见得愿意把乙自身的心腹告诉甲。

=======================友元类的扬言方法和其用法葡京手机登陆网址,=======================

=======================友元类的扬言方法和其用法=======================

     
证明友元类的艺术其实非常粗略,只要大家在类A的成员列表中写下如下语句:

     
评释友元类的办法其实很粗大略,只要大家在类A的积极分子列表中写下如下语句:

friend class B;
friend class B;

  那样一来,类B就被声称成了类A的友元。注意,类B即使是类A的友元,可是两者之间不设有继续关系。那也等于,友元类和原来老大类之间并不曾什么继承关系,也不存在包含恐怕是被含有的涉嫌,友元类和自己上一篇博文《谈谈:C++类的“包含”机制》中的包罗是截然不等同的!

  那样一来,类B就被声称成了类A的友元。注意,类B即便是类A的友元,然则两者之间不存在继续关系。那也实属,友元类和原先老大类之间并不曾什么继承关系,也不设有包蕴或然是被含有的关系,友元类和自己上一篇博文《谈谈:C++类的“包含”机制》中的包罗是截然分歧的!

=======================友元类的多少个切实事例=======================

=======================友元类的3个有血有肉事例=======================

     
在此间,大家引用三个本人从网上征集到的例证来表达友元类的功力:如果大家要规划三个模仿电视和遥控器的次第。我们都之道,遥控机类和电视类是不相包蕴的,而且,遥控器能够操作电视,但是电视不能够操作遥控器,那就比较符合友元的特征了。即咱们把遥控器类表达成电视类的友元。下边是以此事例的切实可行代码:

     
在那里,大家引用二个自作者从网上征集到的例证来表达友元类的效益:倘使大家要规划四个模仿电视机和遥控器的次第。大家都之道,遥控机类和电视类是不相包罗的,而且,遥控器能够操作电视,不过TV不能操作遥控器,那就相比吻合友元的特色了。即我们把遥控器类说明成都电子通信工程大学视机类的友元。上面是那个事例的切切实实代码:

#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;
}
#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;
}

     
我们在程序的第4行定义了3个TVTV类的友元类Tele。那么程序中就能够来调用电视类中的私有成员。上面,是该程序的出口:

     
大家在程序的第肆行定义了贰个电视机TV类的友元类Tele。那么程序中就能够来调用TV类中的私有成员。上边,是该程序的出口:

葡京手机登陆网址 1

葡京手机登陆网址 2

     
好了,那正是友元类了。关于友元类,小编左右是这么认为的,因为友元类有恐怕会损坏数据的安全性,我们还是少用为好哎!在此处自身只是记录一下它的用法罢了,呵呵

     
好了,那正是友元类了。关于友元类,作者左右是那般认为的,因为友元类有恐怕会破坏数据的安全性,我们仍旧少用为好哎!在此处自身只是记录一下它的用法罢了,呵呵

相关文章