我看到了两种不同的方法来实现operator+
。
在标准库中,std::complex
,operator+
实现为非成员函数。在Vector2
工作中使用的类operator+
实现为成员函数。据我所知,std::complex
和Vector2
之间在添加方面没有任何概念上的区别。
在实施Vector2
课程时,有没有理由不使用标准库方法?使用一种方法或另一种方法或仅仅是个人偏好的问题是一些真正的优势吗?
注意:来自x
的{{1}}和y
成员是公开的
答案 0 :(得分:7)
有一个非常强大的理由使它成为非成员函数:LHS和+
表达式的RHS之间的对称性。在std::complex
的情况下,它可以从标量类型(int
,double
等)隐式转换,因此如果运算符是成员,则以下内容不起作用:
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;
}