C++友元如何使用
发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,本文小编为大家详细介绍"C++友元如何使用",内容详细,步骤清晰,细节处理妥当,希望这篇"C++友元如何使用"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、友元的概念什么
千家信息网最后更新 2025年01月19日C++友元如何使用
本文小编为大家详细介绍"C++友元如何使用",内容详细,步骤清晰,细节处理妥当,希望这篇"C++友元如何使用"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。
一、友元的概念
什么是友元?
友元是 C++ 中的一种关系
友元关系发生在函数与类之间或者类与类之间
友元关系是单项的,不能传递
二、友元的用法
在类中以 friend 关键字声明友元
类的友元可以是其它类或者具体函数
友元不是类的一部分
友元不受类中访问级别的限制
友元可以直接访问具体类的所有成员
三、友元的语法
在类中用 friend 关键字对函数或类进行声明
先看一个不使用友元的代码:
#include#include class Point{ double x; double y;public: Point(double x, double y) { this->x = x; this->y = y; } double getX() { return x; } double getY() { return y; } //friend double func(Point& p1, Point& p2);};double func(Point& p1, Point& p2){ double ret = 0; ret = (p2.getY() - p1.getY()) * (p2.getY() - p1.getY()) + (p2.getX() - p1.getX()) * (p2.getX() - p1.getX()); ret = sqrt(ret); return ret;}int main(){ Point p1(1, 2); Point p2(10, 20); printf("p1(%f, %f)\n", p1.getX(), p1.getY()); printf("p2(%f, %f)\n", p2.getX(), p2.getY()); printf("|(p1, p2)| = %f\n", func(p1, p2)); return 0;}
输出结果如下:
这个程序在x 和 y中计算两点之间的距离时需要频繁访问私有成员 x 和 y,所以不得不调用getX() 和getY() 来访问x 和 y,x 和 y 函数中调用了 8 次getX() 和getY(),很麻烦。
这个时候,就该我们的友元上场了:
#include#include class Point{ double x; double y;public: Point(double x, double y) { this->x = x; this->y = y; } double getX() { return x; } double getY() { return y; } friend double func(Point& p1, Point& p2);};double func(Point& p1, Point& p2){ double ret = 0; ret = (p2.y - p1.y) * (p2.y - p1.y) + (p2.x - p1.x) * (p2.x - p1.x); ret = sqrt(ret); return ret;}int main(){ Point p1(1, 2); Point p2(10, 20); printf("p1(%f, %f)\n", p1.getX(), p1.getY()); printf("p2(%f, %f)\n", p2.getX(), p2.getY()); printf("|(p1, p2)| = %f\n", func(p1, p2)); return 0;}
输出结果如下:
四、友元的尴尬
友元是为了兼顾 C 语言的高效而诞生的
友元直接破坏了面向对象的封装性
友元在实际产品中的高效是得不偿失的
友元在现代软件工程中已经逐渐被遗弃
五、注意事项
友元关系不具备传递性
类的友元可以是其它类的成员函数
类的友元可以是某个完整的类
所有的成员函数都是友元
下面来深入分析一下友元:
#includeclass ClassC{ const char* n;public: ClassC(const char* n) { this->n = n; } friend class ClassB;};class ClassB{ const char* n;public: ClassB(const char* n) { this->n = n; } void getClassCName(ClassC& c) { printf("c.n = %s\n", c.n); } friend class ClassA;};class ClassA{ const char* n;public: ClassA(const char* n) { this->n = n; } void getClassBName(ClassB& b) { printf("b.n = %s\n", b.n); } /* void getClassCName(ClassC& c) { printf("c.n = %s\n", c.n); } */};int main(){ ClassA A("A"); ClassB B("B"); ClassC C("C"); A.getClassBName(B); B.getClassCName(C); return 0;}
B 是 C 的友元,A 是 B 的友元,输出结果如下:
既然 A 可以访问 B,B 可以访问 C,那么 A 可以访问 C 么?把上面代码取消注释:
void getClassCName(ClassC& c) { printf("c.n = %s\n", c.n); }
输出报错,这说明友元关系不具备传递性
读到这里,这篇"C++友元如何使用"文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注行业资讯频道。
函数
c.n
C++
成员
输出
之间
文章
结果
代码
关键
关键字
其它类
内容
b.n
妥当
频繁
尴尬
得不偿失
中用
事项
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
女生从事软件开发好吗
宣城护苗网络安全教育课
信息系统安全数据库技术要求
省市区身份证数据库
极路由2刷机打印服务器
软件开发的人事部门很强硬
分析网站源码爬数据库
实时数据库 历史数据库
怎样远程linux服务器
浙大服务器大橙子20
公司邮箱提示无法写入数据库
ie代理服务器
用什么服务器查ip地址
方舟服务器管理器怎么开五通
服务器主板rj45管理口
软件开发 人员安排
nginx三台服务器配置
app数据库同名
汽车网络技术的发展历程
腾讯建服务器
服务器中的陈列卡是什么
光启技术网络安全
合发网络技术青岛分公司
桂林东塔网络安全学院免费试学
南京电子网络技术服务价格
深圳每天惠软件开发有限公司
山西省通讯网络安全三同步
中文科技期刊数据库收录查询
数据库的正确使用方法
如何安装数据库不兼容