【问题标题】:Overloading operators as friend重载运算符为友元
【发布时间】:2012-12-08 15:29:29
【问题描述】:

我知道使用 friend 这个词来访问除自己的类之外的私有成员。例如,我有一个 A 类,需要在 A 的方法中访问属于 B 类的属性的私有方法,我可以将该方法声明为友元。

但是,请看下面的代码:

#include <cstdlib>

class Coord {
  private:
    int x, y;
  public:
    Coord (int i1, int i2) : x(i1), y(i2) {
    }
    friend Coord operator- (Coord const& c1, Coord const& c2) {
        return Coord(c1.x-c2.x, c1.y-c2.y);
    }
    Coord abs() {
        return Coord(std::abs(x),std::abs(y));
    }
};

作为朋友,有什么好处会使操作员超载? 我真的不明白为什么有人会对它感兴趣。

我已经阅读了很多关于它的内容,但我没有一个明确的想法。

谁能写一个小例子让我可以观察到这个事实?

【问题讨论】:

    标签: c++ friend friend-class


    【解决方案1】:

    查看Herb Sutters 和 Scott Meyers 示例:

    这里是总结:

    首先:使运算符像 - 非成员:如果您执行 c = a - b 减号属于哪个对象?一种?乙?或没有。大多数人都不同意,因此不是会员。 第二:运营商需要修改私有内容,因此你要么交朋友,要么使用getter之类的访问功能。所以大多数人都坚持朋友。

    在您的具体示例中,朋友声明后紧跟定义,这是定义全局朋友函数的最紧凑方式。

    【讨论】:

      【解决方案2】:

      当操作符函数被实现为成员函数时,最左边的(或 only) 操作数必须是运算符类的对象(或对对象的引用)。如果 左操作数必须是不同类或基本类型的对象,此运算符函数 必须作为非成员函数实现(例如,当重载 &lt;&lt;&gt;&gt; 分别作为流插入和流提取运算符时)。

      一个非成员运算符函数可以作为一个类的friend,如果该函数 必须直接访问该类的privateprotected 成员。仅当二元运算符的左操作数专门是该类的对象或一元运算符的单个操作数是该类的对象时,才调用特定类的运算符成员函数(由编译器隐式)。

      您可能选择非成员函数来重载运算符的另一个原因是 使运算符能够可交换

      例如,假设我们有一个基本类型变量number,类型为long int,和一个对象bigInteger1,类HugeInteger(其中整数可以可以任意大,而不是受限于底层硬件的机器字长)。减法运算符 (-) 产生一个临时的 HugeInteger 对象作为 HugeIntegerlong int 的差(如表达式 bigInteger1 - number),或作为 long int 和 @ 的差987654336@(如表达式number - bigInteger1)。因此,我们要求减法运算符是可交换的(与两个基本类型的操作数完全一样)。问题是,如果要将该运算符作为成员函数重载,则类对象必须出现在减法运算符的 left 上。因此,我们还将运算符重载为非成员函数,以允许 HugeInteger 出现在减法的右侧。处理左侧HugeIntegeroperator- 函数仍然可以是成员函数。非成员函数可以简单地交换它的参数并调用成员函数。

      【讨论】:

        猜你喜欢
        • 2021-05-18
        • 2011-06-07
        • 2010-11-20
        • 2016-01-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多