全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

C++ 中友元函数与友元类详解

C++ 中友元函数与友元类详解

总的来说,友元分为两类:友元函数与友元类。友元是针对类而言,它提供了一种非类的成员函数来访问类的非公有成员的一种机制。可以把一个函数指定为某类的友元,这个函数称为这个类的友元函数。也可以将类A指定为类B的友元,则类A是类B的友元类,类A的所有成员函数均是类B的友元函数,均可以访问类B的非公有成员。

        友元函数的注意事项:

        (1)友元函数不是类的成员函数,在函数体中访问对象的成员,必须用“对象名.对象成员"方式来访问, 友元函数可以访问类中的所有成员(公有,私有,保护),而一般的函数只能访问类的公有成员。

        (2)友元函数不受类中的访问权限关键字的限制,可以将它放在类的公有,私有,保护部分,结果均一样。

        (3)某类的友元函数的作用域并非该类作用域,如果该友元函数是另一类的成员函数,则其作用域为另一类的作用域,否则与一般函数相同。

        (4)友元函数破坏了面向对象设计的封装特性。所以应该尽量少用。

        友元类

        如果某类B的成员函数会频繁地访问类A的数据成员,而类A的数据成员的private/protected限制造成了类B存取的麻烦,B只能通过A的Public的成员函数进行间接存取。这种情况下可以将类B作为类A的友元类,即类A向类B提供私有和保护成员的访问权限,让类B可以直接存取。

        友元类中的所有成员函数均可以看作是另一类的友元函数。

        友元类的声明: friend chass 类名;

        下面是友元函数的例子

        友元函数可以在类中声明,声明时在函数前增加friend关键字,然后在类体外定义,也可以直接在类中声明定义。这两种方式均可。下面例子中采取的是类中声明,类体外定义的方式。

class Point 
{ 
  friend double Distance(const Point &p1, const Point &p2); //类体中声明 
 
public: 
  Point(int x, int y):x_(x), y_(y) 
  {}; 
 
private: 
  int x_; 
  int y_; 
}; 
 
//类体外定义友元函数 
double Distance(const Point &p1, const Point &p2) 
{ 
  double dx = p1.x_ - p2.x_; //直接访问类的私有成员 
  double dy = p1.y_ - p2.y_; 
  return sqrt(dx*dx+dy*dy); 
} 
 
int main() 
{ 
  Point p1(3,4); 
  Point P2(6,8); 
  cout << Distance(p1,p2) << endl; 
 
  return 0; 
} 

        下面是友元类的例子:      

class Television //电视类 
{ 
  friend class TeleController;//友元类声明 
   
public: 
  Television(int volume, int chanel): volume_(volume), chanel_(chanel){} 
 
private: 
  int volume_; //音量 
  int chanel_; //频道 
}; 
 
class TeleController //遥控器类 
{ 
public: //类中的每个成员函数都是电视类的友元函数,都可以访问电视类的私有数据成员 
  void VolumeUp(Television &tv) 
  { 
    tv.volume_ += 1; //音量加1 
  } 
 
  void VolumeDown(Television &tv) 
  { 
    tv.volume_ -= 1; 
  } 
 
  void ChanelUp(Television &tv) 
  { 
    tv.chanel_ += 1; //频道加1 
  } 
 
  void ChanelDown(Television &tv) 
  { 
    tv.chanel_ -= 1; //频道减1 
  } 
}; 
 
 
int main() 
{ 
  Television tv(1,1); 
  TeleController tc; 
  tc.ChanelUp(tv); 
  return 0; 
} 

        友元类需要注意以下几点:

        (1)友元关系是单向的; 

        (2) 友元关系不能被传递: A是B的友元,B是C的友元,则A是C的友元,这种传递不成立

        (3) 友元关系不能继承:   A是B的友元,A的派生类C也是B的友元,这是不成立的。

         感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# C++  # 友元  # C++友元类  # 友元函数  # C++中的友元函数与友元类详情  # 简要介绍C++编程中的友元函数和友元类  # C++之友元:友元函数和友元类详解  # c++友元函数与友元类的深入解析  # C++友元函数和友元类的使用与区别  # 类中  # 均可  # 体外  # 另一类  # 可以直接  # 某类  # 的是  # 都是  # 访问权限  # 不成立  # 这是  # 非公有  # 放在  # 来访问  # 希望能  # 不受  # 几点  # 造成了  # 将它  # 谢谢大家 


相关文章: 天河区网站制作公司,广州天河区如何办理身份证?需要什么资料有预约的网站吗?  建站ABC备案流程中有哪些关键注意事项?  如何在香港服务器上快速搭建免备案网站?  外贸公司网站制作哪家好,maersk船公司官网?  ,南京靠谱的征婚网站?  如何通过IIS搭建网站并配置访问权限?  威客平台建站流程解析:高效搭建教程与设计优化方案  建站之星24小时客服电话如何获取?  建站主机功能解析:服务器选择与快速搭建指南  建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析  如何解决VPS建站LNMP环境配置常见问题?  阿里云网站制作公司,阿里云快速搭建网站好用吗?  建站之星如何修改网站生成路径?  建站主机选购指南:核心配置优化与品牌推荐方案  如何通过PHP快速构建高效问答网站功能?  Android自定义控件实现温度旋转按钮效果  在线制作视频网站免费,都有哪些好的动漫网站?  c# 服务器GC和工作站GC的区别和设置  代购小票制作网站有哪些,购物小票的简要说明?  创业网站制作流程,创业网站可靠吗?  建站之星代理如何获取技术支持?  如何获取PHP WAP自助建站系统源码?  建站之星如何快速解决建站难题?  大同网页,大同瑞慈医院官网?  如何快速使用云服务器搭建个人网站?  网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?  C#怎么创建控制台应用 C# Console App项目创建方法  网站建设制作、微信公众号,公明人民医院怎么在网上预约?  建站之星后台管理:高效配置与模板优化提升用户体验  上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?  c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】  济南网站制作的价格,历城一职专官方网站?  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  如何登录建站主机?访问步骤全解析  建站之星代理平台如何选择最佳方案?  网站制作培训多少钱一个月,网站优化seo培训课程有哪些?  建站之星CMS五站合一模板配置与SEO优化指南  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  如何在阿里云部署织梦网站?  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  官网网站制作腾讯审核要多久,联想路由器newifi官网  建站中国官网:模板定制+SEO优化+建站流程一站式指南  如何快速生成专业多端适配建站电话?  如何选择高性价比服务器搭建个人网站?  香港服务器部署网站为何提示未备案?  GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  建站之星2.7模板快速切换与批量管理功能操作指南  ,交易猫的商品怎么发布到网站上去?  C#如何在一个XML文件中查找并替换文本内容 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。