前言:
如今大家对“友元函数是成员函数在其中能直接访问私有成员”大体比较看重,小伙伴们都需要分析一些“友元函数是成员函数在其中能直接访问私有成员”的相关知识。那么小编也在网上收集了一些关于“友元函数是成员函数在其中能直接访问私有成员””的相关内容,希望姐妹们能喜欢,小伙伴们快快来了解一下吧!类的私有成员只能通过它的成员函数来访问。
友元函数是一扇通往私有成员的后门。
一个对象的私有数据只能通过其成员函数进行访问,这是一堵不透明的墙。这种限制性给这样的一种情况造成困扰:类的某些成员原则上应该是私有的,但却需要在外部频繁地访问它们。常用的做法是为类设计一个返回这些成员引用的获取函数get(),这无疑带来了额外的开销。因此,仅仅出于效率(而非技术上必须)的考虑,C++提供了一种辅助手段中,允许类外面的类、普通函数或成员函数去访问一个类的私有数据,这就是友元(friend)机制。
一个类的友元可以是一个外部函数,也可以是一个类。它们虽然不是该类的成员,但却能直接访问该类的任何成员,这显然提高了访问效率,但带来的问题是,这在一定程序上违背了数据封装原则。
友元机制使全局函数或其他类的成员函数、甚至是某个类定义所有的成员函数可以直接访问当前类的私有成员。
友元是对类的访问控制或封装性的一种突破或破坏。友元可以是一个一般函数(友元函数),也可以是另一个类的成员函数(友元成员),还可以是整个类(友元类)。
友元机制允许一个类将对其非公有成员的访问权授予指定的函数或类。友元的声明以关键字 friend 开始。它只能出现在类定义的内部。友元声明可以出现在类中的任何地方:友元不是授予友元关系的那个类的成员,所以它们不受声明出现部分的访问控制影响。
操作符定义为非成员函数时,通常必须将它们设置为所操作类的友元。
1 友元函数
友元可以是友元类,可以是友元函数,也就是独立于类的全局函数,如果该全局函数被某个类声明为友元,该全局函数就被授予了访问该类私有成员和保护成员的资格。
友元函数声明:
class ca{int x, y;friend funa(); //友元普通函数friend cb::mfun(); //友元成员函数friend class cc;};
以上声明的非类的成员函数的函数(类外的全局函数)便可在实现时访问类ca的私有成员了。
2 有元类
所谓有元类就是两个有缘的类。其中一个类A将另一个类B声明为友元,则类B的成员函数能够访问A的所有成员,无论这些成员是公有的还是私有的。友元其实是对于访问控制的一种有限突破。想私有,但想让特定(朋友)的类能够访问。
声明友元类的方法为:
class A{ friend class B; ……}
将整个类设置为友元,极大地破坏了类的封装性。在C++中,还可以单独地将某个函数或某个类的某个成员函数声明为友元:
class A{ friend 返回值类型 函数名()参数表; //友元函数 friend 返回值类型 B::成员函数名()参数表; //友元成员函数}3 实例
#include <iostream.h>#include <math.h>const double PI = 3.14159;class Point{ double x,y; // 默认为私有成员public: Point(double xx, double yy) { x = xx; y = yy; } void display() { cout<<"("<<x<<","<<y<<")"<<endl; } friend double distance(Point &a, Point &b); // 声明友元函数 friend class Circle; // 声明友元类};// 实现友元函数double distance (Point &a,Point &b) // 引用类对象作为形参{ double dx = a.x-b.x; // 访问对象的私有成员 double dy = a.y-b.y; return sqrt(dx*dx+dy*dy);}class Circle // 友元类的声明和实现{ double cir;public: void circum(Point a,Point b) // 用类对象作为形参 { double dx = a.x-b.x; // 访问对象的私有成员 double dy = a.y-b.y; cir = PI * sqrt(dx*dx+dy*dy); cout<<"the circumstance of circle is "<<cir<<endl; }};void main(){ Point p1(2.0,2.0), p2(5.0,6.0); cout<<"p1:"; p1.display(); cout<<"p2:"; p2.display(); double d = distance(p1,p2); // 调用友元函数 cout<<"p1和p2的距离="<<d<<endl; Circle c; c.circum(p1,p2); cin.get();}/*p1:(2,2)p2:(5,6)p1和p2的距离=5the circumstance of circle is 15.708*/
-End-