友元函数
目的:在友元函数中像调用类公有成员一样调用私有成员 。
友元类
目的:使友元类的所有方法都可以访问原始类的私有、保护成员。
例子:遥控器可以控制电视机换台,遥控器为电视机友元类。
//.h
Class A{
friend Class B;
int abc;
double xx;
};
Class B{
public:
int func(const A& a);
};
//.cpp
int B::func(const A& a){
return a.abc; // 直接访问类A的私有成员
}
互为友元类时,在第一个类声明时,方法中时仅包含第二个类的引用,不加入实现,因为此时编译器还没有看到第二个类的实现。而将实现放在第二个类声明之后。(此部分针对内联函数)
重载
重载运算符目的:使对象操作更加美观。
例子:
Time a;
Time b;
Time c = a.sum(b);--> Time c =a+b;
实现:
一类:成员函数重载运算符 显式调用一个参数,隐式调用一个参数
Time Time::operator+(const Time& b);
同一类内可访问传入参数对象的私有成员。详解
二类:非成员函数重载运算符 显式调用两个个参数
Time operator+(const Time& a,const Time& b);
运算符重载中的友元
目的:解决重载二元运算符调用类私有成员问题
例子:
Time a;
int b = 2;
Time c = a*2; //通过成员函数重载 * 实现
Time c = 2*a; //无法实现,因为非成员函数重载后的 * ,无法访问类私有成员
解决办法:
将非成员重载函数声明为该类的友元函数
//.h
class Time{
private:
int hours;
int mins;
friend Time operator* (int b ,const Time& a);
//1、友元函数不是类成员函数,不能在类声明中定义。
};
//.cpp
友元函数定义方式1:
Time operator(int b,const Time& a){ //友元函数定义
Time res;
res.hours = b*a.hours; // 友元函数中,直接通过类对象调用私有成员。
...
return res;
}
友元函数定义方式2:
Time operator(int b,const Time& a){ //友元函数定义
return a*b; //通过重载的成员函数 * 计算。
}
总结:
1、重载运算符:分类成员函数重载与非成员函数重载,任选其一。
2、友元函数:类内声明,类外实现。只需声明时加friend
,定义时按照普通函数定义,不需要加。
3、友元函数中,直接通过类对象调用私有成员,如:class.private_val。
参考资料: 友元函数:C++ Primer Plus 11.3节;
友元类:C++ Primer Plus 15.1节。