服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++实例代码详解友元函数

C++实例代码详解友元函数

2022-12-14 14:33Bright-SKY C/C++

采用类的机制后实现了数据的隐藏与封装,类的数据成员一般定义为私有成员,成员函数一般定义为公有的,依此提供类与外界间的通信接口。但是,有时需要定义一些函数,这些函数不是类的一部分,但又需要频繁地访问类的数

友元函数 可以直接操作类的私有数据。

friend关键字在声明处修饰函数 那么该函数就是类的友元。

友元 不是类的一部分。

 

友元概述

c++允许 友元 访问 私有数据。

友元的语法:

friend关键字只出现在声明处 其他类、类成员函数、全局函数都可声明为友元 友元函数不是类的成员,不带this指针 友元函数可访问对象任意成员属性,包括私有属性。

 

普通全局函数作为类的友元

//房间类
class Room
{
  //将goodGayVisit作为类的友元函数
  //goodGayVisit 访问 类中所有数据 但是 它不是类的成员
  friend void goodGayVisit(Room &room);
private:
  string bedRoom;//卧室
public:
  string sittingRoom;//客厅
public:
  Room()
  {
      this->bedRoom = "卧室";
      this->sittingRoom="客厅";
  }
};
// 普通全局函数 作为 类的友元
//好基友 访问 我的房间
void goodGayVisit(Room &room)
{
  cout<<"好基友访问了你的"<<room.sittingRoom<<endl;
  cout<<"好基友访问了你的"<<room.bedRoom<<endl;//ok
}
void test01()
{
  Room myRoom;
  goodGayVisit(myRoom);
}

运行结果:

C++实例代码详解友元函数

 

类的某个成员函数作为另一个类的友元

问题1:

C++实例代码详解友元函数

问题2:

C++实例代码详解友元函数

成员函数内 不能访问 Room的私有数据

C++实例代码详解友元函数

最终代码:

#include <iostream>
using namespace std;
class Room;//Room向前声明
class GoodGay
{
public:
  void visit1(Room &room);//此处的Room 被上方 class Room
  void visit2(Room &room);
};
class Room
{
  //如果想方 visit2作为Room类的友元 那么Visit2就可以访问 Room的私有数据
  //一定要记得 加类作用域
  friend void GoodGay::visit2(Room &room);
private:
  string bedRoom;//卧室
public:
  string sittingRoom;//客厅
public:
  Room()
  {
      this->bedRoom = "卧室";
      this->sittingRoom="客厅";
  }
};
void GoodGay::visit1(Room &room)
{
  cout<<"好基友visit1访问了你的"<<room.sittingRoom<<endl;
  //cout<<"好基友visit1访问了你的"<<room.bedRoom<<endl;//不能访问 Room私有数据
}
void GoodGay::visit2(Room &room)
{
  cout<<"好基友visit2访问了你的"<<room.sittingRoom<<endl;
  cout<<"好基友visit2访问了你的"<<room.bedRoom<<endl;
}
int main(int argc, char *argv[])
{
  Room myRoom;
  GoodGay goodGay;
  goodGay.visit1(myRoom);//只能访问客厅
  goodGay.visit2(myRoom);//客厅 卧室 都可以访问
  return 0;
}

运行结果:

C++实例代码详解友元函数

 

一个类整体作为另一个类的友元

一个类的所有成员函数 访问 另一个类的私有数据

#include <iostream>
using namespace std;
class Room;//Room向前声明
class GoodGay
{
public:
  void visit1(Room &room);//此处的Room 被上方 class Room
  void visit2(Room &room);
};
class Room
{
  //将GoodGay作为Room的友元
  //GoodGay 所有成员函数 都可以访问 Room私有数据
  friend class GoodGay;
private:
  string bedRoom;//卧室
public:
  string sittingRoom;//客厅
public:
  Room()
  {
      this->bedRoom = "卧室";
      this->sittingRoom="客厅";
  }
};
void GoodGay::visit1(Room &room)
{
  cout<<"好基友visit1访问了你的"<<room.sittingRoom<<endl;
  cout<<"好基友visit1访问了你的"<<room.bedRoom<<endl;
}
void GoodGay::visit2(Room &room)
{
  cout<<"好基友visit2访问了你的"<<room.sittingRoom<<endl;
  cout<<"好基友visit2访问了你的"<<room.bedRoom<<endl;
}
int main(int argc, char *argv[])
{
  Room myRoom;
  GoodGay goodGay;
  goodGay.visit1(myRoom);
  goodGay.visit2(myRoom);
  return 0;
}

运行结果:

C++实例代码详解友元函数

 

友元的注意事项

1.友元关系不能被继承。

2.友元关系是单向的,类A是类B的朋友,但类B不一定是类A 的朋友。

3.友元关系不具有传递性。类B是类A的朋友,类C是类B的朋友,但类C不一定是类A的朋 友

 

封装电视机 和遥控器的类

1、封装电视机的类

class TV
{
  enum{ On,Off }; //电视状态
  enum{ minVol,maxVol = 100 }; //音量从0到100
  enum{ minChannel = 1,maxChannel = 255 }; //频道从1到255
private:
  int mState; //电视状态,开机,还是关机
  int mVolume; //电视机音量
  int mChannel; //电视频道
public:
  TV()
  {
      this->mState = Off;//默认关机
      this->mVolume = minVol;
      this->mChannel = minChannel;
  }
  void onOrOff(void)
  {
      this->mState = (this->mState == On ? Off:On);
  }
  //加大音量
  void volumeUp(void)
  {
      if(this->mVolume >= maxVol)
          return;
      this->mVolume++;
  }
  //减小音量
  void volumeDown(void)
  {
      if(this->mVolume <= minVol)
          return;
      this->mVolume--;
  }
  //增加频道
  void channelUp(void)
  {
      if(this->mChannel >= maxChannel)
          return;
      this->mChannel++;
  }
  //减小频道
  void channelDown(void)
  {
      if(this->mChannel <= minChannel)
          return;
      this->mChannel--;
  }
  //显示电视机的状态
  void showTVState(void)
  {
      cout<<"电视机的状态为:"<< (this->mState==On ? "开机":"关机") <<endl;
      cout<<"电视机的音量:"<<this->mVolume<<endl;
      cout<<"电视机的频道:"<<this->mChannel<<endl;
  }
};
void test01()
{
  TV tv;
  tv.onOrOff();//开机
  tv.volumeUp();//调四次音量
  tv.volumeUp();
  tv.volumeUp();
  tv.volumeUp();
  tv.channelUp();//调三次频道
  tv.channelUp();
  tv.showTVState();
}

运行结果:

C++实例代码详解友元函数

2、设置遥控器的类2-1

class TV
{
  friend class Remote;
  //默认为私有
  enum{ On,Off }; //电视状态
  enum{ minVol,maxVol = 100 }; //音量从0到100
  enum{ minChannel = 1,maxChannel = 255 }; //频道从1到255
private:
  int mState; //电视状态,开机,还是关机
  int mVolume; //电视机音量
  int mChannel; //电视频道
public:
  TV()
  {
      this->mState = Off;//默认关机
      this->mVolume = minVol;
      this->mChannel = minChannel;
  }
  void onOrOff(void)
  {
      this->mState = (this->mState == On ? Off:On);
  }
  //加大音量
  void volumeUp(void)
  {
      if(this->mVolume >= maxVol)
          return;
      this->mVolume++;
  }
  //减小音量
  void volumeDown(void)
  {
      if(this->mVolume <= minVol)
          return;
      this->mVolume--;
  }
  //增加频道
  void channelUp(void)
  {
      if(this->mChannel >= maxChannel)
          return;
      this->mChannel++;
  }
  //减小频道
  void channelDown(void)
  {
      if(this->mChannel <= minChannel)
          return;
      this->mChannel--;
  }
  //显示电视机的状态
  void showTVState(void)
  {
      cout<<"电视机的状态为:"<< (this->mState==On ? "开机":"关机") <<endl;
      cout<<"电视机的音量:"<<this->mVolume<<endl;
      cout<<"电视机的频道:"<<this->mChannel<<endl;
  }
};
//遥控器类
class Remote
{
private:
  TV *pTv;
public:
  Remote(TV *pTv)
  {
      this->pTv = pTv;
  }
  //音量的加减
  void volumeUp(void)
  {
      //调节的电视机的音量
      this->pTv->volumeUp();
  }
  void volumeDown(void)
  {
      this->pTv->volumeDown();
  }
  //频道的加减
  void channelUp(void)
  {
      this->pTv->channelUp();
  }
  void channelDown(void)
  {
      this->pTv->channelDown();
  }
  //电视开关
  void onOrOff(void)
  {
      this->pTv->onOrOff();
  }
  //遥控器设置频道设置
  void setChannel(int num)
  {
      //判断 频道 是否有效
      if(num >= TV::minChannel && num<= TV::maxChannel )
      {
          this->pTv->mChannel = num;
      }
  }
  void showTVState(void)
  {
      this->pTv->showTVState();
  }
};
void test02()
{
  TV tv;
  Remote remote(&tv);
  remote.onOrOff();
  remote.volumeUp();
  remote.volumeUp();
  remote.volumeUp();
  remote.volumeUp();
  remote.channelUp();
  remote.channelUp();
  remote.showTVState();
  remote.setChannel(75);
  remote.showTVState();
}

运行结果:

C++实例代码详解友元函数

到此这篇关于C++实例代码详解友元函数的文章就介绍到这了,更多相关C++友元函数内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/qq_34981463/article/details/125055865

延伸 · 阅读

精彩推荐
  • C/C++C语言实现Fibonacci数列递归

    C语言实现Fibonacci数列递归

    这篇文章主要介绍了C语言实现Fibonacci数列递归,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随...

    被Python玩的Kenny6362021-08-16
  • C/C++c++中strcpy函数在VS2015无法使用的问题

    c++中strcpy函数在VS2015无法使用的问题

    这篇文章主要介绍了c++中strcpy函数在VS2015无法使用的问题,具有一定的参考价值,有需要的可以了解一下。...

    Dmego11432021-04-20
  • C/C++C++映像劫持后门实例分析

    C++映像劫持后门实例分析

    这篇文章主要介绍了C++映像劫持后门,实例分析了C++映像劫持后门的原理与相关实现技巧,有助于进一步了解后门的原理,需要的朋友可以参考下...

    C++教程网10212021-02-25
  • C/C++C++分析讲解类的静态成员函数如何使用

    C++分析讲解类的静态成员函数如何使用

    与静态数据成员不同,静态成员函数的作用不是为了对象之间的沟通,而是为了能处理静态数据成员,静态成员函数没有this指针。既然它没有指向某一对象...

    清风自在 流水潺潺6012022-11-14
  • C/C++C语言实现通用数据结构之通用链表

    C语言实现通用数据结构之通用链表

    这篇文章主要为大家详细介绍了c语言实现通用数据结构之通用链表,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    swwlqw3652022-03-05
  • C/C++C++内存泄漏及检测工具详解

    C++内存泄漏及检测工具详解

    最简单的方法当然是借助于专业的检测工具,比较有名如BoundsCheck,功能非常强大,相信做C++开发的人都离不开它。此外就是不使用任何工具,而是自己来实...

    C++教程网10632021-01-05
  • C/C++C语言三个函数的模拟实现详解

    C语言三个函数的模拟实现详解

    这篇文章主要为大家详细介绍了C语言三个函数的模拟实现,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能...

    WangLongxyd9752022-10-27
  • C/C++一篇文章彻底弄懂C++虚函数的实现机制

    一篇文章彻底弄懂C++虚函数的实现机制

    C++中的虚函数的作用主要是实现了多态的机制,基类定义虚函数,子类可以重写该函数,在派生类中对基类定义的虚函数进行重写时,需要在派生类中声明该方法...

    彼 方8022021-11-19