在C#中,重载任何运算符的方法(函数)必须是
static
和public
。
我认为制作它
static
是一件好事,每个对象不需要它自己的版本。
但在 C++ 中,它不一定是
static
。为什么 C# 强制执行此操作而 C++ 不执行?
两种设计的优点和缺点是什么?
为什么 C++ 不强制运算符重载为“静态”?
如果将重载运算符函数设置为静态,它将无法访问
this
。人们需要访问重载函数内的 this
,因为该函数通常会更改 this
的状态。
如果您不需要访问该函数内部的
static
,则可以创建一个重载运算符函数this
,这本质上意味着您没有操纵调用该运算符函数的对象的状态。所以这是可能的,但不常见或本质上是期望的。
将全局重载运算符函数设置为静态会将运算符函数的范围限制为同一文件。
鉴于上述两者,编译器不会强制重载运算符函数为静态,因为强制它不会提供真正的优势或便利,而不是强制相同提供更多便利。
为什么 C# 强制运算符重载为“静态”?
这比我能更好地解释它。
有什么优点和缺点?
好吧,第一个问题的答案确实说明了何时可以将重载运算符函数设为静态,并解释了优点/缺点。
为什么 C# 强制重载运算符为
?static
我不是 C# 设计师之一。 一个潜在的原因是,C++ 的经验表明,运算符的参数之间存在不对称性(这是拥有成员二元运算符的直接结果)是一个坏主意。
为什么 C++ 不强制重载运算符为
?static
因为没有以前的经验可以借鉴,而且这似乎是个好主意? (这种区别在 Algol68 中没有意义,Algol68 是早于 C++ 的少数具有运算符重载的语言之一。顺便说一句,C++ 在运算符重载方面没有重复 Algol68 的错误。)
因为它们是不同的语言。 我不太懂 C#,所以我不会 对它的评论太多了,但在 C++ 中,一些运算符,如
[]
和 ()
(更不用说复制赋值运算符)不能是静态的,对于
各种原因。 一般来说,为什么你想要一个操作员
静止的? 我认为我从未在 C++ 中将运算符设为静态。 这
经典的二元算术运算符通常是自由函数,并且
所有其他运营商成员。 (有人可以争论是否更好
对于 operator++
是会员或自由功能,但最广泛
传播实践似乎是让他们成为会员。)
我认为 C# 强制执行它是因为它更有意义,而不是因为它是错误的。
添加 2 个对象时,我很难理解
this
参数,所以我认为他们强制执行它是为了降低复杂性,但运算符非静态仍然没有问题,只是更容易理解。