当前位置:首页 > 实用技巧 >

友元函数放在哪里(怎么理解友元函数)

来源:原点资讯(www.yd166.com)时间:2024-01-10 05:03:53作者:YD166手机阅读>>

什么是友元

C 规定私有成员只能在类的成员函数内部访问,如果想在别处访问对象的私有成员,只能通过类提供的接口(成员函数)间接地进行。这固然能够带来数据隐藏的好处,利于将来程序的扩充,但也会增加程序书写的麻烦。
C 设计者们认为,如果有的程序员真的非常怕麻烦,就是想在类的成员函数外部直接访问对象的私有成员,那还是做一点妥协以满足他们的愿望为好,这也算是眼前利益和长远利益的折中。因此,C 就有了友元(friend)的概念,简单点理解就是:朋友是值得信任的,所以可以对他们公开自己的隐私。

相比与c 而言,java就直接去掉了友元。C 由于是从结构化的C语言发展而来的,需要照顾结构化设计程序员的习惯,所以在对私有成员可访问范围的问题上不可限制太死。

友元分两种:友元类、友元函数。

友元类
  • 友元类定义

一个类 A 可以将另一个类 B 声明为自己的友元,类 B 的所有成员函数就都可以访问类 A 对象的私有成员。在类定义中声明友元类的写法为:

friend class 类名;

  • 友元类使用示例

class CCar { private: int price; friend class CDriver; }; class CDriver { public: CCar myCar; void ModifyCar() { myCar.price = 1000; } };

第 4 行使得 CDriver 类的所有成员函数都能访问 CCar 对象的私有成员。如果没有第 5 行,第 10 行对 myCar 私有成员 price 的访问就会导致编译错误。

  • 友元类的特点

1)一般来说,类 A 将类 B 声明为友元类,则类 B 最好从逻辑上和类 A 有比较接近的关系。例如上面的例子,CDriver 代表司机,CCar 代表车,司机拥有车,所以 CDriver 类和 CCar 类从逻辑上来讲关系比较密切,把 CDriver 类声明为 CCar 类的友元比较合理。

2)友元类不具备传递性,即类 A 是类 B 的友元,类 B 是类 C 的友元,并不能导出类 A 是类 C 的友元。

友元函数
  • 友元函数定义

在定义一个类的时候,可以把一些函数(包括全局函数和其他类的成员函数)声明为“友元”,这样那些函数就成为该类的友元函数,在友元函数内部就可以访问该类对象的私有成员了。
将全局函数声明为友元的写法为:

friend 返回值类型 函数名(参数表);

将其他类的成员函数声明为友元的写法为:

friend 返回值类型 其他类的类名::成员函数名(参数表);

注意:不能把其他类的私有成员函数声明为友元。

  • 友元函数示例

#include<iostream> using namespace std; class CCar; //提前声明CCar类,以便后面的CDriver类使用 class CDriver { public: void ModifyCar(CCar* pCar); }; class CCar { private: int price; friend int MostExpensiveCar(CCar cars[], int total); //声明友元 friend void CDriver::ModifyCar(CCar* pCar); //声明友元 }; void CDriver::ModifyCar(CCar* pCar) { pCar->price = 1000; } int MostExpensiveCar(CCar cars[], int total) { int tmpMax = -1; for (int i = 0; i<total; i) if (cars[i].price > tmpMax) tmpMax = cars[i].price; return tmpMax; }

第 12 行将全局函数 MostExpensiveCar 声明为 CCar 类的友元,因此在第 21 行可以访问 cars[i] 的私有成员 price。同理,第 14 行将 CDriver 类的 ModifyCar 成员函数声明为友元,因此在第 18 行可以访问 pCar 指针所指向的对象的私有成员变量 price。

总结

友元,看起来很灵活但是也使得面向对象变得更加凌乱,使用友元的代码往往很难阅读与维护,所以对于新开发的代码还是应该像java语言那样,将需要对外使用的私有变量通过成员函数来暴露出去,而尽量少使用友元。

,

栏目热文

友元类所有函数(友元模板函数有几种)

友元类所有函数(友元模板函数有几种)

C 使用类对数据进行隐藏和封装,类的数据成员一般定义为私有成员,而将提供类与外界通讯接口的成员函数定义为公有的。C ...

2024-01-10 04:59:58查看全文 >>

清明上河图保存在哪个地方(清明上河图保存在哪些地方)

清明上河图保存在哪个地方(清明上河图保存在哪些地方)

明代画家仇英仿造的《清明上河图》被卖出了9位数的天价,一件后世仿品居然能卖的这么贵,那么真品的价格肯定会更高。北宋绘画师...

2024-01-10 05:11:47查看全文 >>

刷墙怎么省事(刷墙怎么干得快)

刷墙怎么省事(刷墙怎么干得快)

墙面刷新喷涂工艺由于乳胶漆施工起来较为简单方便,有的业主又想节省一些装修费用,于是便打算自己来动手刷墙。在家装中,刷墙是...

2024-01-10 04:44:20查看全文 >>

刷墙工具小妙招(自己动手刷墙需要哪些工具)

刷墙工具小妙招(自己动手刷墙需要哪些工具)

1刷墙需要准备哪些工具?9寸滚筒:用于大面积刷墙4寸滚简:用于刷边缘4寸羊毛刷:用于刷边边角角塑料桶:盛装乳胶漆、防止浪...

2024-01-10 04:40:12查看全文 >>

刷墙怎么刷直线(刷墙最简单教程)

刷墙怎么刷直线(刷墙最简单教程)

人还是穷点好,不穷你都不知道自己有多聪明!为什么我会这么说呢?直接给大家看一下朋友新房的装修,很多前来参观的人非说墙上贴...

2024-01-10 04:48:13查看全文 >>

友元函数模板图(函数模板友元函数)

友元函数模板图(函数模板友元函数)

在C 中,可以使用模板来创建泛型代码,以处理不同类型的数据。友元声明是一种特殊的声明,它允许在类定义中访问私有成员。当...

2024-01-10 05:18:51查看全文 >>

友元函数可以调用静态成员吗(友元函数访问私有成员)

友元函数可以调用静态成员吗(友元函数访问私有成员)

C 是一门非常强大和灵活的面向对象编程语言,它提供了类和对象的概念,让程序员可以根据不同的场景设计和实现自定义的数据类...

2024-01-10 04:34:12查看全文 >>

友元函数怎么转换成员(友元函数怎么调用成员函数)

友元函数怎么转换成员(友元函数怎么调用成员函数)

什么是友元C 面向对象的特点是数据封装和数据隐藏。然而,某些类外部函数可能要使用类内部成员变量,这就需要将成员变量设置...

2024-01-10 04:30:49查看全文 >>

友元函数能访问成员吗(友元函数访问私有成员)

友元函数能访问成员吗(友元函数访问私有成员)

友元函数我们知道在c 中类具有封装、继承、多态、数据私有化的特性,一般的类外函数无法直接对类的数据进行操作,如果想让类...

2024-01-10 05:12:19查看全文 >>

消毒水味太重怎么去除

消毒水味太重怎么去除

图文|自来水博士请您点击右上方“关注”,获取更多水的知识。欢迎留言、点赞、收藏、关注。自来水博士,研究自来水至今14年。...

2024-01-10 05:10:58查看全文 >>

文档排行