友元函数、友元类及运算符重载与友元函数的结合利用

友元函数
目的:在友元函数中像调用类公有成员一样调用私有成员
友元类
目的:使友元类的所有方法都可以访问原始类的私有、保护成员
例子:遥控器可以控制电视机换台,遥控器为电视机友元类。

//.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节。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值