C++友元如何使用
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,本文小编为大家详细介绍"C++友元如何使用",内容详细,步骤清晰,细节处理妥当,希望这篇"C++友元如何使用"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、友元的概念什么
千家信息网最后更新 2026年11月01日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安全错误
数据库的锁怎样保障安全
互联网科技保险
互联网科技有限公司经营范围
互联网与科技发展
高科技与互联网
互联网科技公司官网
善班互联网科技有限公司
广州慧亚互联网科技怎么样
福州新华互联网科技学校 知乎
世界互联网科技公司市值排名
宜昌元轩互联网科技有限公司
科技类公司包括互联网吗
广州新华互联网科技学校电竞方面
佛山市翊博互联网络科技有限公司
互联网时代的科技公司
从那以后互联网科技有限公司
昆明中奇联合互联网科技
全球科技与互联网公司市值变化
恒生科技指数 中概互联网
网互联网络科技
知域互联网科技有限公司官网
精品咖啡豆
深圳市人人互联网科技有限公司
上海睿民互联网科技有限公司
深圳科技互联网
多迪互联网科技有限公司
新华互联网科技校企合作
互联网科技扶贫时间
为客找房互联网科技公司怎么样
高科技互联网套路
广西泛欧互联网科技有限公司