3

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

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

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

注意:来自xy成员Vector2都是公开的

4

1 回答 1

7

它是一个非成员函数有一个非常充分的理由:+表达式的 LHS 和 RHS 之间的对称性。在 的情况下std::complex,它可以从标量类型( 等)隐式转换intdouble因此如果运算符是成员,则以下内容将不起作用:

std::complex<double> c1;
std::complex c2<double> = 5.0 + c1; 

而以下将:

std::complex c2<double> = c1 + 5.0;

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

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

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;
}
于 2013-08-01T06:52:33.460 回答