友元函数(friend function)
1. 什么是友元函数?
一个类的私有数据成员通常只能由类的函数成员来访问,而友元函数可以访问类的私有数据成员,也能访问其保护成员
2. 友元函数的用处体现在哪里?
a.使用友元函数可提高性能,如:用友元函数重载操作符和生成迭代器类
b.用友元函数可以访问两个或多个类的私有数据,较其它方法使人们更容易理解程序的逻辑关系
3. 使用友元函数前应注意:
a.类的友元函数在类作用域之外定义,但可以访问类的私有和保护成员
b.尽管类定义中有友元函数原型,友元函数仍然不是成员函数
c.友元函数不是类的成员函数,所以不能用句柄(对象)加点操作符来调用
d.public, private, protected成员访问符与友员关系的声明无关,因此友元关系声明可在类定义的任何位置,习惯上在类定义的开始位置
e.友元关系是指定的,不是获取的,如果让类B成为类A的友元类,类A必须显式声明类B为自己的友元类
f.友元关系不满足对称性和传递性
g. 如果一个友元函数想与两个或更多类成为友元关系,在每个类中都必须声明为友元函数
4. 注:由于C++属于混合语言,常在同一个程序中采用两种函数调用且这两种函数调用往往是相反的。类C语言的调用将基本数据或对象传递给函数,C++调用则是将函数(或信息)传递给对象
实例1. 友元函数的声明、定义与使用
#include <iostream>
using namespace std;
class Car{
friend void display(Car); //类"Car"的友元函数display()声明
private:
int speed;
public:
Car(int s){ speed = s; }
};
//友元函数定义
void display(Car x){cout << x.speed << endl;}
void main()
{
Car c(10);
display(c); //友元函数的使用 //将对象"c"传给友元函数
}
输出结果: 100
实例2. 将一个函数声明为多个类的友元
#include <iostream>
using namespace std;
class Virus; //类'Virus'未定义前要用到,需事先声明
class Bacteria{
private:
int life;
public:
Bacteria() {life=1;}
//类'Bacteria'中,将Check声明为友元函数
friend void Check(Bacteria, Virus);
};
class Virus
{
private:
int life;
public:
Virus() : life(0) {}
friend void Check(Bacteria, Virus); //类'Virus'中,将Check声明为友元函数
};
void Check (Bacteria b, Virus v) //友元函数的定义
{
if (b.life==1)
cout<<"/nA bacteria is alive.";
if (v.life==1)
cout<<"/nA virus is alive.";
}
void main()
{
Bacteria fever;
Virus cholera;
Check(fever, cholera); //友元函数的调用
}
输出结果:A bacteria is alive.
友元类(friend class)
1. 友元类可以访问与之为友元关系的类的所有私有成员
2. 友元类使用较少
实例: 友元类
#include <iostream>
using namespace std;
class Add{
private:
int x,y;
public:
Add(){ x=y=4;}
friend class Support; //类'Support'现在是类'Add'的朋友
};
class Support{
public:
void Sum(Add ob){ cout<< (ob.x+ob.y)<<endl;}
};
void main()
{
Add ad;
Support sup;
sup.Sum(ad);
}
输出结果: 8