gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 19:57:45 24 4
gpt4 key购买 nike

我最近刚刚发现复合赋值运算符(例如 operator+=operator-=)可以在类作用域外重载。

考虑:

class X { }; // A third party class

// The following function is legal:
X& operator+=(X& lhs, const X& rhs) {
// ...
}

显然,非成员函数不能触及X 的私有(private)接口(interface),所以这里不存在封装问题。但它确实让它看起来好像是 X 自己的界面的一部分,但显然不是。

在我看来,这可能会导致一些严重的代码滥用和令人困惑的行为。想象一下,有人认为将它用于一些具有标准包含(例如 std::vectorstd::map)的“聪明的黑客”会很好。

这是特别奇怪的,因为其他操作符,如 operator[]operator-> 不能是非成员函数,我认为这就是原因。

那么为什么允许呢?

最佳答案

So why is it allowed?

你要求我们读懂 Stroustrop 的思想。不可能。
但 C++ 的一般原则是不限制开发人员(我们不提供可以安全使用的绝育工具集。我们提供全套 Razor 锯和旋转连枷)。

It seems to me this can lead to some serious code abuse and confusing behavior. Imagine someone thought it would be nice to use it for some "clever hacks" with standard contains such as std::vector or std::map.

是的,它可以。
当您滥用运算符重载时,它可能会导致一些危险和致命的事情。最好不要这样做(尤其是对其他人或标准类)。

但它可以提供一些潜在有用的情况(当你小心的时候)。这在构建数字“类型”类时特别有用,因为它有助于自动转换,使代码更易于阅读。

关于c++ - 为什么重载的复合赋值运算符可以是非成员函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30278281/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com