友元类

转载 2013年12月04日 09:55:13

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

      当一个类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++友元函数和友元类的使用基础

友元函数百度百科:       友元函数是指某些虽然不是类成员却能够访问类的所有成员的函数。。类授予它的友元特别的访问权。通常同一个开发者会出于技术和非技术的原因,控制类的友元和成员函数(否则当你想...
  • zgrjkflmkyc
  • zgrjkflmkyc
  • 2013年03月13日 11:27
  • 4872

C++友元类使用之前置声明(定义变量)

今天项目使用到了友元类,于是便先试着搞个简单地使用例子 #include class b; class a { private: int value; protected: void funprote...
  • LYS_SONG
  • LYS_SONG
  • 2016年09月29日 10:23
  • 825

一个友元类使用误区(C++)

这个问题,我困扰了好一会。决定记录一下
  • qq_33850438
  • qq_33850438
  • 2016年12月09日 21:10
  • 1086

C++的“友元类”的一个使用场景

我遇到了“必须使用友元类”的一个场景。 我遇到了A中有B,B中有A的场景。 貌似“A的一个函数,作为B的友元函数”这个需求无法被实现。 #include class MyApiCls; cla...
  • u013600225
  • u013600225
  • 2016年03月08日 17:32
  • 950

C++中友元类使用场合

在C++中我们可以將函数定义成类的友元函数,这样在函数中就可以访问类的私有成员。与函数相同,类也可以作为另一个类的友元类,在友元类中可以访问另外一个类的所有成员。 声明友元类的方法很简单,只需在类中...
  • Rongbo_J
  • Rongbo_J
  • 2015年04月17日 10:48
  • 4137

C++之友元函数和友元类

在介绍类和对象时,已经说过类具有封装性,类中的私有成员一般只有通过该类中的成员函数才可以访问,而程序中的其他函数时无法直接访问类中的私有成员的。如果在一定的条件下需要访问类的私有成员,就必须通过对象来...
  • erlian1992
  • erlian1992
  • 2015年03月04日 20:00
  • 1276

C++: 友元函数和友元类详解

(1) 友元关系不能被继承。 (2) 友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。 (3)...
  • rl529014
  • rl529014
  • 2016年07月17日 22:40
  • 887

对c++友元函数和友元类的理解

1,友元函数的定义和作用 我们已知道类具有封装和信息隐藏的特性。只有类的成员函数才能访问类的私有成员,程序中的其他函数是无法访问私有成员的。非成员函数可以访问类中的公有成员,但是如果将数据成员都定...
  • zzuchengming
  • zzuchengming
  • 2016年06月26日 20:44
  • 619

C++构造、析构函数和友元类小总结

/*假如一个人CA把感冒病毒传染给了朋友CB,用这件事写成C++小测试程序,复习下C++的友元,C++的构造和析构函数进行堆内存申请和释放。记得知识点: (1)类声明了一个友元函数或者友元类,目的是友...
  • Blues1021
  • Blues1021
  • 2012年11月24日 17:28
  • 1662

C++之friend友元类和友元函数

将数据和处理数据的函数封装在一起,构成类,实现了数据的隐藏,无疑是面向对象程序设计的一大优点。但是有时候封装不是绝对的。 友元函数提供了不同类或对象的成员函数之间、类的成员函数和一般函数之间进行数据共...
  • Mary19920410
  • Mary19920410
  • 2017年04月10日 21:44
  • 388
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:友元类
举报原因:
原因补充:

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