2011-05-13 218 views
1

在C#中,重载任何运算符的方法(函数)必须是staticpublicC++运算符重载

我看到,使它成为一件好事,每个对象都不需要它自己的版本。

但是在C++中,它不一定是static。为什么C#强制执行此操作而C++不执行?

这两种设计的优缺点是什么?

+2

的操作符重载可以在C++静态。 – 2011-05-13 07:33:53

+2

即使运算符不是静态的,它也不会认为每个对象都有自己的*代码* – 2011-05-13 07:34:56

+0

@Neil:我没有说它不能是“静态”,我只是问为什么编译器不会像C#那样使其成为“静态”。 – Sherif 2011-05-13 07:36:34

回答

2

为什么C++不强制运算符重载是“静态”?
如果您使重载的运算符功能为静态,它将无法访问this。在重载函数中需要访问this,因为通常该函数会改变this的状态。

如果您不需要访问该函数内的this,则可以创建一个重载的运算符函数static,这基本上意味着您不操纵调用操作符函数的对象的状态。所以它是可以选择的,但不是通常或基本上需要。

使全局重载的运算符函数static将限制运算符函数的作用域为同一个文件。

鉴于上述两种,编译器不执行重载操作功能是因为执行将提供没有真正的优点或方便,而不是执行相同的提供更多的便利静态的。

为什么C#强制运算符重载是 “静态”?
This解释它比我更好。

有哪些优势和劣势?
好了,回答的第一个问题不说出来的时候一个能有这样的解释的优点/ disdvantage一个重载的操作符的功能的静态&。

+0

我重建了我的问题。 – Sherif 2011-05-13 08:06:10

1

为什么C#实施重载操作符为static

我不是C#的设计师之一。一个潜在的原因是C++的经验表明,运算符的参数之间存在不对称(这是成员二元运算符的直接后果)是一个坏主意。

为什么C++不强制重载操作符为static

因为以前没有经验可以继续开发,这似乎是一个好主意吗? (这个区别在Algol68中是没有意义的,它是少数几种早于C++的语言之一,它具有运算符重载.BTW C++没有重复运算符重载中的Algol68错误。)

+0

对不起,我不明白这部分“运营商的论点之间的不对称(这是成员二元运营商的直接后果)是一个坏主意”。 – Sherif 2011-05-13 19:27:36

+0

@mavric,通常你会期望运算符是可交换的,即+ b等于b + a。如果一个论点是特殊的(一个成员称为对象),语言规则使得交换性难以实现。例如在C++中,隐式转换将不可用。 – AProgrammer 2011-05-13 19:46:36

+0

所以你是这样说的:编译器强制它是静态的,以强制每个运算符重载方法都应该返回一个值,而不仅仅是它的对象数据? – Sherif 2011-05-14 17:01:28

0

我认为C#强制执行它,因为它更好理解,而不是它会是错误的。
添加2个对象时,我很难理解this参数,所以我认为他们强制执行它以降低复杂性,但运算符非静态仍然没有问题,只是更容易理解。

1

因为它们是不同的语言。我不是很了解C#,所以我不能对 评论太多,但在C++中,一些运营商,如[](), (更不用说复制分配运算符)不能是静态的,对于 各种原因。一般来说,你为什么要运营商是静态的 ?我不认为我曾经在C++中创建过静态运算符。经典的二元算术运算符通常是自由函数,并且是所有其他运算符成员。 (人们可以认为无论是operator++更好 成为会员或免费的功能,但最宽 传播的做法似乎是让他们的成员。)