zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Xamarin.Forms学习之位图(一)
    Xamarin.Forms学习之Platform-specific API和文件操作
    Xamarin.Forms学习之Page Navigation(二)
    Xamarin.Forms学习之Page Navigation(一)
    Xamarin.Forms学习之XAML命名空间
    Xamarin.Forms学习之初
    新手浅谈C#Task异步编程
    新手浅谈Task异步编程和Thread多线程编程
    新手浅谈C#关于abstract和interface
    Boost C++ 库
  • 原文地址:https://www.cnblogs.com/mrlonely2018/p/14818536.html
Copyright © 2011-2022 走看看