1

我对使用这个词有一个想法friend,可以访问除自己的类之外的私有成员。例如,我有一个 A 类,需要在 AI 的方法中访问 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));
    }
};

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

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

有人可以写一个我可以观察到事实的小例子吗?

4

2 回答 2

3

看看Herb Sutters和 Scott Meyers 的例子:

总结如下:

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

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

于 2012-12-08T15:36:32.670 回答
2

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

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

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

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

于 2012-12-08T15:37:05.453 回答