C++友元如何使用
发表于:2024-10-19 作者:千家信息网编辑
千家信息网最后更新 2024年10月19日,本文小编为大家详细介绍"C++友元如何使用",内容详细,步骤清晰,细节处理妥当,希望这篇"C++友元如何使用"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、友元的概念什么
千家信息网最后更新 2024年10月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安全错误
数据库的锁怎样保障安全
重庆发生的网络安全事件
武汉员工服务管理软件开发
做软件开发两个显示器怎么选
怎么联系网络技术
江阴市检察院网络安全
真格网络技术服务
追剧达人 服务器
fa图标在服务器不显示
谁有卖小米云服务器的
锡山区电子软件开发信息推荐
软件开发框架排行
焦作服务器机箱批发
上海市信息网络安全管理协
安装数据库出现错误1406
大侠云服务器安装虚拟机
csgo怎么看玩过的社区服务器
商店管理系统数据库怎么建表
国家社会科学文献中心数据库免费
数据库的外键6
网络安全攻击大事件
软件开发人员工资开支标准
阿里云服务器如何恢复
网络安全网络文明教育ppt
网络安全检查月报告
知名网络安全公司
奎屯app软件开发制作
存储服务器提示vg异常怎么解决
加强网络安全的最基本措施是
淮安云服务器供应商
赞丽显示找不到服务器