背景:在某些情况下,特别是在对某些成员函数多次调用时,由于参数传递,类型检查和安全性检查等都需要时间开销,而影响程序的运行效率。为了解决上述问题,提出一种使用友元的方案。
△友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类。友元函数的特点是能够访问类中的私有成员的非成员函数。友元函数从语法上看,它与普通函数一样,即在定义上和调用上与普通函数一样
友元函数是可以直接访问类的私有成员的非成员函数。它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字friend。
☆友元函数的参数:
因为友元函数没有this指针,则参数要有三种情况:
要访问非static成员时,需要对象做参数;
要访问static成员或全局变量时,则不需要对象做参数;
如果做参数的对象是全局对象,则不需要对象做参数;
☆友元函数的位置:
因为友元函数是类外的函数,所以它的声明可以放在类的私有段或公有段且没有区别。
☆友元函数和类的成员函数的区别:
成员函数有this指针,而友元函数没有this指针。
友元函数是不能被继承的,就像父亲的朋友未必是儿子的朋友。
以下为一个例子:
#include<iostream>
using std::cout;
using std::cin;
using std::endl;
class CTyre{
private:
int radius;
int width;
public:
CTyre(){ cout<<"CTyre contructor"<<endl;}
~CTyre(){ cout<<"CTyre destructor"<<endl;}
//友元函数的声明(在类中)
friend void CCar(const int &radius,const int &width);
};//别忘了分号
//友元函数的定义(在类外)
void CCar(int &radius,int &width)
{
cout<<"汽车轮胎的半径为:"<<radius<<endl;
cout<<"汽车轮胎的厚度为:"<<width<<endl;
}
int main(){
int tr,tw;
cout<<"请输入汽车轮胎的半径:"<<endl;
cin>>tr;
cout<<"请输入汽车轮胎的厚度:"<<endl;
cin>>tw;
CCar(tr,tw);
return 0;
}
作者:华中师范大学 计算机学院 蒲东齐
文本作者才疏学浅,如有错误,请指正!