在Wandevoorde&Jossutis的书中有两个参数的非友元运算符+

Non-friend operator+ with two parameters in Wandevoorde&Jossutis' book

本文关键字:参数 两个 运算符 友元 Jossutis Wandevoorde      更新时间:2023-10-16

学习表达式模板

在Wandevode和Jossutis的《模板》一书中,完整指南第18.2.3节运算符中,他们定义了一个带有两个参数的operator+,但不是friend方法。

template <typename T, typename R1, typename R2>
Array<T,A_Add<T,R1,R2> >
operator+ (Array<T,R1> const& a, Array<T,R2> const& b) {
    return Array<T,A_Add<T,R1,R2> >
           (A_Add<T,R1,R2>(a.rep(),b.rep()));
}

我是一个初学者,因此对我所了解的C++缺乏安全感。

这个operator+不应该是friend吗?

我试过

class A{
public:
    explicit A(int x) : a(x){};
    A& operator+(const A& x, const A& y){
        A temp{x.a + y.a};
        return temp;
    };
private:
    int a;
};

我得到一个二进制'operator+'参数太多

您的"二进制"operator +成员函数会出现"参数太多"错误,因为它有三个参数:您指定的xy,以及隐式this参数。这意味着它实际上需要三个论点,当然这是不可能的。

你可以让一个成员函数采用一个显式参数和隐式this,但在许多人看来,这些二进制运算符(如加法和减法)最好在类之外实现,在与类相同的命名空间中实现,作为采用两个显式参数的自由函数。如果可以公开访问完成操作所需的数据(否则必须使用friend,如果确实需要,也可以),那么这种方法尤其有效。

为下一位读者总结。

重载二进制算术运算符似乎有三种形式。

第一个:通过const引用获取一个参数的成员方法。使用const到返回值(根据此参考)来避免(x+y)=z

class A{
  const A operator+(const A& other){
    // ... 
  };
};

第二:一个友元方法,因此包含在类的定义中,取两个参数。

class A{
  friend A& operator+(const A& operand1, const A& operand2){
    // ... 
  };
};

第三:采用两个参数的非成员方法。

class A{
  // ...
};
A operator+(const A& operand1, const A& operand2){
   // ...
};