[英]Why can overloaded compound assignment operators be non-member functions?
我刚刚发现复合赋值运算符(例如operator+=
或operator-=
)可以在类范围之外重载。
考虑:
class X { }; // A third party class
// The following function is legal:
X& operator+=(X& lhs, const X& rhs) {
// ...
}
显然,非成员函数不能触及X
的私有接口,因此这里没有封装问题。 但它确实使它看起来好像它是X
自己界面的一部分,显然它不是。
在我看来,这可能导致一些严重的代码滥用和混乱的行为。 想象一下,有人认为将它用于标准包含的一些“聪明的黑客”会更好,例如std::vector
或std::map
。
这是特别奇怪的,因为其他运算符如operator[]
和operator->
不能成为我认为是这个原因的非成员函数。
那么为什么允许呢?
那么为什么允许呢?
你要求我们阅读Stroustrop的思想。 不可能。
但是C ++的一般原则并不是限制开发人员(我们不提供一套可以安全使用的绝对工具。我们提供全套剃刀锯和旋转连枷)。
在我看来,这可能导致一些严重的代码滥用和混乱的行为。 想象一下,有人认为将它用于标准包含的一些“聪明的黑客”会更好,例如std :: vector或std :: map。
是的,它可以。
当你滥用运算符重载时,它可能导致一些危险和致命的事情。 最好不要这样做(特别是对其他人或标准班)。
但它可以提供一些潜在的有用情况(当你小心的时候)。 这在构建数字“类型”类时特别有用,因为它有助于自动转换,使代码更自然。
考虑库A是否定义了一个对象(比如说一个Matrix对象)。 库B扩展了库A,其中包含一些类似的对象(比如说Vector)。
库B想要定义将矩阵链接到向量的运算符(例如,乘法)。 但是如果定义这些运算符重载必须在原始对象中完成,则编写器将被卡住,并且用户将处于奇怪的情况,他们可以执行向量*矩阵,但不能执行矩阵*向量。
如你所述,特别注意+ =和 - =,考虑1乘n矩阵,它本质上是一个向量。 我们现在希望能够执行矩阵+ =向量。
允许在外部定义它们可以避免此问题。
在我看来,这可能导致一些严重的代码滥用和混乱的行为
非常正确。 但是不要忘记这是一种内置预处理器的语言。 如果其他开发人员想让您感到困惑,他们已经拥有了更强大的工具。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.