类的友元函数是定义在类外部,但有权访问类的所有私有(private
)成员和保护(protected
)成员。尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数。
友元可以是一个函数,该函数被称为友元函数
;
友元也可以是一个类,该类被称为友元类
,在这种情况下,整个类及其所有成员都是友元。
使用关键字 friend
,定义 友元函数
与 友元类
。
1 2 3 4 5 6 7 8 9 10 11 12
| class Box { double width; public: double length; friend void printWidth( Box box ); void setWidth( double wid ); };
friend class ClassTwo;
|
友元函数的使用:
因为友元函数没有this指针,则参数要有三种情况:
- 要访问非
static
成员时,需要对象做参数;
- 要访问
static
成员或全局变量时,则不需要对象做参数;
- 如果做参数的对象是全局对象,则不需要对象做参数,可以直接调用友元函数,不需要通过对象或指针。
实例:
友元类,友元函数的使用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| #include <iostream>
using namespace std;
class Box { double width;
public: friend void printWidth(Box box); friend class BigBox; void setWidth(double wid); };
class BigBox { public: void Print(int width, Box &box) { box.setWidth(width); cout << "Width of box : " << box.width << endl; } };
void Box::setWidth(double wid) { width = wid; }
void printWidth(Box box) { cout << "Width of box : " << box.width << endl; }
int main() { Box box; BigBox big;
box.setWidth(10.0);
printWidth(box);
big.Print(20, box);
getchar(); return 0; }
|
结果:
1 2
| Width of box : 10 Width of box : 20
|