友元的概念什么是友元?友元是 C++ 中的一种关系友元关系发生在函数与类之间或类与类之间友元的关系是单项的,不能传递友元的用法在类中以 friend 关键字声明友元类的友元可以是其它类或者具体函数友元不是类的一部分友元不受类中访问级别的限制友元可以直接访问具体类的所有成员友元的语法在类中用 friend 关键字对函数或类进行声明class Point{ double x; double y; friend void func(Point& p);};void func(Point& p){}编程实验: 友元的使用初探#include <stdio.h>#include <math.h>class Point{private: 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_2(Point& p1, Point& p2);};// 发生多次函数调用,稍低效double func_1(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;}double func_2(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(“func_1 : |(p1, p2)| = %f\n”, func_1(p1, p2)); printf(“func_2 : |(p1, p2)| = %f\n”, func_2(p1, p2)); return 0;}输出:p1(1.000000, 2.000000)p2(10.000000, 20.000000)func_1 : |(p1, p2)| = 20.124612func_2 : |(p1, p2)| = 20.124612友元的尴尬友元是为了兼顾 C 语言的高效而诞生的友元直接破坏了面向对象的封装性友元在实际产品中的高效得不偿失友元在现代软件工程中已经逐渐被遗弃注意事项友元关系不具备传递性类的友元可以是其它类的成员函数类的友元可以是某个完整的类所有的成员函数都是友元编程实验: 友元的深入分析#include <stdio.h>#include <math.h>class ClassC{private: const char* n;public: ClassC(const char* n) { this->n = n; } friend class ClassB;};class ClassB{private: 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{private: const char* n;public: ClassA(const char* n) { this->n = n; } void getClassBName(ClassB& b) // 注意这里! { printf(“b.n = %s\n”, b.n); }};int main(){ ClassA A(“A”); ClassB B(“B”); ClassC C(“C”); A.getClassBName(B); B.getClassCName(C); return 0;}输出:b.n = Bc.n = C小结友元是为了兼顾 C 语言的高效而诞生的友元直接破坏了面向对象的封装特性友元关系不具备传递性类的友元可以是其它类的成员函数类的友元可以是某个完整的类以上内容参考狄泰软件学院系列课程,请大家保护原创!