C++成员与非成员运算符+

Mir*_*pas 3 c++ operator-overloading

我看到了两种不同的实现方法operator+.

在标准库,std::complex,operator+被实现为非成员函数.在Vector2工作中使用的类operator+是作为成员函数实现的.据我所知,加法之间std::complexVector2加法之间没有概念上的区别.

在实现Vector2类时是否有任何理由不使用标准库方法?使用一种方法或另一种方法或仅仅是个人偏好的问题是一些真正的优势吗?

注:xy从成员Vector2都是公共

jua*_*nza 7

它有很强的理由成为非成员函数:+表达式的LHS和RHS之间的对称性.在的情况下std::complex,它是由一个标量类型(隐式转换int,double等等),所以下面如果操作者是一个构件是行不通的:

std::complex<double> c1;
std::complex c2<double> = 5.0 + c1; 
Run Code Online (Sandbox Code Playgroud)

而以下是:

std::complex c2<double> = c1 + 5.0;
Run Code Online (Sandbox Code Playgroud)

这种不一致没有多大意义.非成员二元运算符允许进行隐式转换.

注意:根据我对数学向量类型的经验,通常需要提供涉及其他向量类型的算术运算符:

template <typename V>
Vector2 operator+(const Vector2& lhs, const V& rhs)
{
  Vector2 ret = lhs;
  ret += rhs;  // uses member function template operator +=(const V&)
  return ret;
}

template <typename V>
Vector2 operator+(const V& lhs, const Vector2& rhs)
{
  return rhs + lhs;
}
Run Code Online (Sandbox Code Playgroud)