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