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

发布时间 - 2026-01-11 02:03:48    点击率:

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++友元函数和友元类的使用与区别  # 类中  # 均可  # 体外  # 另一类  # 可以直接  # 某类  # 的是  # 都是  # 访问权限  # 不成立  # 这是  # 非公有  # 放在  # 来访问  # 希望能  # 不受  # 几点  # 造成了  # 将它  # 谢谢大家 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Win11怎样安装网易有道词典_Win11安装词典教程【步骤】  如何在景安服务器上快速搭建个人网站?  Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】  Laravel怎么自定义错误页面_Laravel修改404和500页面模板  JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)  香港服务器租用费用高吗?如何避免常见误区?  如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)  如何快速启动建站代理加盟业务?  Bootstrap CSS布局之列表  如何用免费手机建站系统零基础打造专业网站?  高防服务器租用首荐平台,企业级优惠套餐快速部署  如何在云主机上快速搭建网站?  laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析  Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中  PHP 500报错的快速解决方法  百度浏览器如何管理插件 百度浏览器插件管理方法  浅谈Javascript中的Label语句  怎样使用JSON进行数据交换_它有什么限制  高端建站三要素:定制模板、企业官网与响应式设计优化  JS中页面与页面之间超链接跳转中文乱码问题的解决办法  Laravel PHP版本要求一览_Laravel各版本环境要求对照  Laravel如何使用Gate和Policy进行授权?(权限控制)  如何快速配置高效服务器建站软件?  想要更高端的建设网站,这些原则一定要坚持!  常州企业网站制作公司,全国继续教育网怎么登录?  Python数据仓库与ETL构建实战_Airflow调度流程详解  Laravel如何从数据库删除数据_Laravel destroy和delete方法区别  HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】  Python文件流缓冲机制_IO性能解析【教程】  Win11怎么设置默认图片查看器_Windows11照片应用关联设置  如何注册花生壳免费域名并搭建个人网站?  Laravel的.env文件有什么用_Laravel环境变量配置与管理详解  Laravel怎么实现支付功能_Laravel集成支付宝微信支付  公司门户网站制作流程,华为官网怎么做?  动图在线制作网站有哪些,滑动动图图集怎么做?  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  Android仿QQ列表左滑删除操作  Laravel如何为API编写文档_Laravel API文档生成与维护方法  Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法  nodejs redis 发布订阅机制封装实现方法及实例代码  Linux系统命令中screen命令详解  Laravel如何与Inertia.js和Vue/React构建现代单页应用  UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】  如何在云主机上快速搭建多站点网站?  Python文件操作最佳实践_稳定性说明【指导】  如何快速上传建站程序避免常见错误?  Laravel如何使用Sanctum进行API认证?(SPA实战)  悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤