c++ - 重载运算符作为友元

标签 c++ friend friend-class

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

但是,请看下面的代码:

#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));
    }
};

作为 friend ,哪种好处可能会使运算符(operator)负担过重? 我真的不明白为什么有人会对此感兴趣。

我已经阅读了很多关于它的内容,但我没有得到一个清晰的概念。

谁能写一个小例子让我观察事实?

最佳答案

看看Herb Sutters和 Scott Meyers 的例子:

总结如下:

首先:使运算符像 - 非成员:如果执行 c = a - b minus 属于哪个对象? A?乙?或者没有。大多数人都不同意,因此不是成员(member)。 第二:运营商需要修改私有(private)内容,因此要么你交个 friend ,要么你使用像getters这样的访问函数。所以大多数人都和 friend 在一起。

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

关于c++ - 重载运算符作为友元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13778902/

相关文章:

c++ - std::enable_if 和 std::shared_ptr

c++ - 如何在 .cpp 文件中为私有(private)类成员定义 friend operator<< 而不是在 header 中?

C++:模板可以成为类的 friend 吗?

c++常量函数声明变体?

c++ - SDL-1.2.15 中的 SDL lib 文件夹在哪里?

c++ - 未定义对友元运算符的引用

C++ 友元类

c++ - friend 类概念如何不需要前向声明(forward declaration)?

c++ - 如何声明模板友元函数的特化

c++ - 初始化一个结构,其成员是另一个结构的数组