友元
一般来说,类的公有成员能够在类外访问,私有的成员只能被类的其他成员函数访问。
在C++中,可以定义友元,如果某一个函数定义为类的友元,则该函数就可以访问该类的私有函数。也可以把一个类定义为另一个类的友元。
友元函数
如果在某个类的定义中用friend
声明了一个外部函数(或者是其他类的成员函数,既可以是public
型,也可以是private
型)后,这个外部函数称为类的友元函数。
C++提供一种允许外部类和函数存取类的私有成员和保护成员的辅助方法,即将它们声明为一个给定类的友元(或友元函数),使其具有类成员函数的访问权限,但友元本身不是类的成员,它不属于任何类。
使用:
- 关键字:
friend
开头的函数原型,声明可以放在类的私有部分,或者公有部分,无区别,都说明是该类的一个友元函数,但它不是该类的成员函数,不属于任何类; - 友元函数的定义,可以在类的内部或外部;
- 在类外定义友元函数时,与普通函数的定义一样,不应在函数名前用类名加以限制。因此友元函数不像成员函数那样在调用时使用对象名,友元函数要多类的成员进行访问,必须在参数表中显式指明要访问的对象。
- 友元函数是能访问类的所有成员的普通函数,一个函数可以是多个类的友元函数,只需要在各个类中分别声明;
- 调用与一般函数的调用方式及原理一致;
- C++不允许将构造函数、析构函数和虚函数声明为友元函数
友元的非成员函数
友元函数是可以直接访问类的私有成员的非成员函数。它是定义在类外的普通函数,需要在类的定义中加以声明,声明时只需在友元的名称前加关键字**friend
**,
friend 函数原型;
非成员函数的友元函数有如下特点。
- 在类内只需对函数进行声明,声明位置没有要求,可以出现在类的任何地方,包括在
private
和public
部分。 - 函数定义要放在类外,具体定义位置没有要求。
- 友元函数不能直接访问类的成员,必须通过访问对象来实现。为此,必须传递类对象作为函数参数,采用传值、传指针或传引用方式均可,出于对程序执行效率的考虑,建议使用类对象的引用作为参数。
- 友元函数不是类的成员函数,所以友元函数的实现和普通函数一样,在实现时不用作用域限定符“::”指示属于哪个类,只有成员函数才使用“::”作用域符号。
- 一个函数可以同时作为多个类的友元函数。
非成员形式的友元函数代码如下所示。
//友元函数的例子
#include <iostream>
#include <math.h>
using namespace std;
class Point
{
public:
Point(double i, double j) //构造函数,带默认参数值
{
x = i;
y = j;
}
void disp()
{
cout<<"("&