在Wandevoorde& Jossutis的书中,非朋友操作员+有两个参数

时间:2014-10-29 23:56:15

标签: c++ operator-overloading friend

学习表达式模板

在Wandevoode和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;

};

我正在使用二进制&#39;运算符+&#39;参数太多

2 个答案:

答案 0 :(得分:1)

你的&#34;二进制&#34; operator +成员函数为您提供了太多参数&#34;错误,因为它有三个参数:您指定的xy,以及隐式this参数。这意味着它实际上需要三个参数,这当然是不可能的。

你可以使一个成员函数采用一个显式参数和隐式this,但是在许多人看来,这些二元运算符如加法和减法更好地在类外部实现,在同一名称空间中该类,作为带有两个显式参数的自由函数。如果可以公开访问完成操作所需的数据,那么这种方法尤其有效(否则您必须使用friend,如果真的有必要,这是正常的。)

答案 1 :(得分:0)

总结下一位读者。

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

首先:通过const引用获取一个参数的成员方法。使用const返回值(根据this reference)以避免(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){
   // ...
};