我看到了 2 种不同的实现方法operator+
。
在标准库中,std::complex
,operator+
被实现为非成员函数。在Vector2
工作中使用的类operator+
被实现为成员函数。据我所知,加法之间没有概念上的std::complex
区别Vector2
。
实现类时是否有任何理由不使用标准库方法Vector2
?使用一种方法或另一种方法是否有一些真正的优势,或者只是个人喜好问题?
注意:来自x
的y
成员Vector2
都是公开的
我看到了 2 种不同的实现方法operator+
。
在标准库中,std::complex
,operator+
被实现为非成员函数。在Vector2
工作中使用的类operator+
被实现为成员函数。据我所知,加法之间没有概念上的std::complex
区别Vector2
。
实现类时是否有任何理由不使用标准库方法Vector2
?使用一种方法或另一种方法是否有一些真正的优势,或者只是个人喜好问题?
注意:来自x
的y
成员Vector2
都是公开的
它是一个非成员函数有一个非常充分的理由:+
表达式的 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;
}