- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
友元函数和友元类在实际开发中较少使用,想快速学习C++的读者可以跳过本节。
一个类中可以有 public、protected、private 三种属性的成员,通过对象可以访问 public 成员,只有本类中的函数可以访问本类的 private 成员。现在,我们来介绍一种例外情况——友元(friend)。借助友元(friend),可以使得其他类中的成员函数以及全局范围内的函数访问当前类的 private 成员。fnend 的意思是朋友,或者说是好友,与好友的关系显然要比一般人亲密一些。我们会对好朋友敞开心扉,倾诉自己的秘密,而对一般人会谨言慎行,潜意识里就自我保护。在C++中,这种友好关系可以用 friend 关键字指明,中文多译为“友元”,借助友元可以访问与其有好友关系的类中的私有成员。如果你对“友元”这个名词不习惯,可以按原文 friend 理解为朋友。
友元函数
在当前类以外定义的、不属于当前类的函数也可以在类中声明,但要在前面加 friend 关键字,这样就构成了友元函数。友元函数可以是不属于任何类的非成员函数,也可以是其他类的成员函数。友元函数可以访问当前类中的所有成员,包括 public、protected、private 属性的。
1) 将非成员函数声明为友元函数。
请大家直接看下面的例子:
#include iostream
using namespace std;
class Student{
public:
Student(char *name, int age, float score);
public:
friend void show(Student *pstu); //将show()声明为友元函数
private:
char *m_name;
int m_age;
float m_score;
};
Student::Student(char *name, int age, float score): m_name(name), m_age(age), m_score(score){ }
//非成员函数
void show(Student *pstu){
coutpstu-m_name的年龄是 pstu-m_age,成绩是 pstu-m_scoreendl;
}
int main(){
Student stu(小明, 15, 90.6);
show(stu); //调用友元函数
Student *pstu = new Student(李磊, 16, 80.5);
show(pstu); //调用友元函数
return 0;
}
运行结果:小明的年龄是 15,成绩是 90.6李磊的年龄是 16,成绩是 80.5show() 是一个全局范围内的非成员函数,它不属于任何类,它的作用是输出学生的信息。m_name、m_age、m_score 是 Student 类的 private 成员,原则上不能通过对象访问,但在 show() 函数中又必须使用这些 private 成员,所以将 show() 声明为 Student 类的友元函数。读者可以亲自测试一下,将上面程序中的第 8 行删去,观察编译器的报错信息。注意,友元函数不同于类的成员函数,在友元函数中不能直接访问类的成员,必须要借助对象。下面的写法是错误的:
void show(){
coutm_name的年龄是 m_age,成绩是 m_scoreendl;
}
成员函数在调用时会隐式地增加 this 指针,指向调用它的对象,从而使用该对象的成员;而 show() 是非成员函数,没有 this 指针,编译器不知道使用哪个对象的成员,要想明确这一点,就必须通过参数传递对象(可以直接传递对象,也可以传递对象指针或对象引用),并在访问成员时指明对象。
2) 将其他类的成员函数声明为友元函数
friend 函数不仅可以是全局函数(非成员函数),还可以是另外一个类的成员函数。请看下面的例子:
#include iostream
using namespace std;
class Address; //提前声明Address类
//声明Student类
class Student{
public:
Student(char *name, int age, float score);
public:
void show(Address *addr);
private:
char *m_name;
int m_age;
float m_score;
};
//声明Address类
class Address{
您可能关注的文档
- 幼儿园主题教育活动学习材料.doc
- 国际贸易实务(贸易术语).ppt
- 《桃-花-源-记》课件.ppt
- 政 治必修二-2.2-民主决策:作出最佳选择--用.ppt
- 中考二轮-二次函数压轴题-专题复习总结-20题(含答案).doc
- 初三电学计算题专题讲解.doc
- 北师大版二年级下册期末测试卷和答案(三).doc
- 第六节-手工编程基础.ppt
- 社工工作室各项工作流程.doc
- 小学新生入学一日常规培训课件.doc
- 甘肃省徽县第三中学2025届四下数学期末达标测试试题含解析.doc
- 2025年新能源汽车智能驾驶算法在车载智能座舱中的应用研究报告.docx
- 宁夏幼儿师范高等专科学校《机械类专业认知教育》2023-2024学年第一学期期末试卷.doc
- 2025年半导体封装键合工艺技术创新在智能家居安全系统中的应用报告.docx
- 江苏省通州区金郊初级中学2025年初三4月统一测试(一模)数学试题试卷含解析.doc
- 2025年新能源汽车供应链协同创新模式研究报告.docx
- 百色职业学院《中外乐器演奏》2023-2024学年第一学期期末试卷.doc
- 2024-2025学年湖南长沙市岳麓区初三(下)期末语文试题试卷含解析.doc
- 2025届河南省新乡市一中教育集团达标名校初三考前模拟考试英语试题含答案.doc
- 劳务用工安全培训课件.pptx
文档评论(0)