C++友元函数运算符重载

3种友元:1、友元函数;2、友元类;3、友元成员函数。

需要友元的一个常见情形:为类的双目运算符重载。

A = B * 2.75;

将被转换为以下的成员函数调用:

A = B.operator* ( 2.75);

但如果:

A = 2.75 * B;

则无法匹配到合适的成员函数,因为左侧的操作数应该是一个调用对象,但2.75不是对象。

解决方式:使用非成员函数重载。

cls operator* (double m, const cls & t);

由于非成员函数不由对象调用,它使用的所有值都是显式参数,因而可以根据需要的顺序获得操作数(先double,后cls)。

引发问题:非成员函数不能直接访问类的私有数据。

解决方法:友元函数(特殊的非成员函数,可访问类的私有成员)。

创建友元函数:

friend cls operator* (double m, const cls & t);

友元函数原型的声明在类的声明中,但它不是成员函数,但它拥有成员函数的访问权限。

友元函数定义时,不要写friend关键字(除非函数定义也是原型),不要使用cls::限定符(不是成员函数)。

总结:类中声明的友元函数不是成员函数,其访问权限与成员函数相同。(区分友元成员函数,其为B类成员函数需要访问A类私有成员,在A类中声明friend void B::func();)。

最常使用友元重载的运算符:“ << ” 。重载后与cout配合直接显示对象的内容。

重载运算符的选择:类的成员函数还是非成员函数(友元)? 请参考 11.6.2 转换函数和友元函数。

——————————————————————————————————

笔记摘录整理自:《C++ Primer Plus (第6版)中文版》11.3 友元

——————————————————————————————————

实验:

将 << 重载函数前的friend 关键字去掉,出现 too many parameters for this operator function 错误:

原因分析:

使用成员函数重载运算符时,第一个操作数通过this指针隐式地传递,因此出现参数过多的错误,因为去掉friend后只需要一个参数。

把friend添加回来:

通过vscode的代码补全功能我们验证了其不是类的成员函数。

参考:https://stackoverflow.com/questions/16291623/operator-overloading-c-too-many-parameters-for-operation

原文地址:https://www.cnblogs.com/mrlonely2018/p/14818536.html