繁体   English   中英

为什么重载复合赋值运算符可以是非成员函数?

[英]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::vectorstd::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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM