C# 定义运算符+;,=和+= 我曾经从C++注释中阅读下面的语句, 在C++中,定义运算符+和=没有给+=正确的含义。此语言设计错误已在C中修复#

C# 定义运算符+;,=和+= 我曾经从C++注释中阅读下面的语句, 在C++中,定义运算符+和=没有给+=正确的含义。此语言设计错误已在C中修复#,c#,c++,operator-overloading,C#,C++,Operator Overloading,我想知道这份声明到底想说什么?与操作符重载有关吗?< P>这意味着在C++中,如果您定义了自己的运算符 + < /代码>和运算符 = /Cuth>为您的类,这仍然不意味着您的类将自动支持 += 运算符。如果您想让+=操作符为您的类工作,则必须显式地单独定义+= 在C#中,如果我理解正确,为类定义操作符+和=也意味着可以在类中使用操作符+=。+=将通过运算符+和运算符=的组合来“模拟”。例如,表达式a+=b将被解释为a=a+b 在C++中,这种方式不起作用。如果不明确定义+=,a+=b将导致编译器

我想知道这份声明到底想说什么?与操作符重载有关吗?

< P>这意味着在C++中,如果您定义了自己的运算符<代码> + < /代码>和运算符<代码> = /Cuth>为您的类,这仍然不意味着您的类将自动支持<代码> += 运算符。如果您想让
+=
操作符为您的类工作,则必须显式地单独定义
+=

在C#中,如果我理解正确,为类定义操作符
+
=
也意味着可以在类中使用操作符
+=
+=
将通过运算符
+
和运算符
=
的组合来“模拟”。例如,表达式
a+=b
将被解释为
a=a+b

<>在C++中,这种方式不起作用。如果不明确定义
+=
a+=b
将导致编译器错误,即使定义了
+
=

它说,在C中,如果重载运算符+C,将自动模拟运算符+=作为+和=(
a=a+b
等于
a+=b
)。在C++中,它没有实现,但它不是bug。在C++和=中不给+=,因为大多数+=工作比+快,因为不需要创建一个更多的对象。 这就是为什么大部分运算符+都是使用+=运算符编写的。考虑休闲代码:

class foo
{
public:
   foo& operator+=(const foo& rhs)
   {
   //.......
   }
};
const foo operator+(const foo& lhs,const foo& rhs)
{
   foo temp = lhs;
   return temp+= rhs;
}

我更喜欢C++运算符重载机制。在我看来,这绝对不是一个设计缺陷

+
=
+=
是三个不同的运算符。如果要使用
+=
,需要重载
+=
。重载
+
=
不会使
+=
工作


<>我想补充一下,在C++中,E1+E= 代码>代码> E1 < /C> >只对一次进行评价。我不知道C#中的确切规则。

C#不允许运算符重载,因为它不允许直接指针管理。它的行为是固定的,取决于它是引用类型还是值类型。出于同样的原因,您不能重载+=。它的意义永远是做加法和赋值。因此,您只能决定+对您的数据结构的意义。

我想补充一点,它不是一个bug,创建
+
=
不会自动创建
+=
-运算符。
+
从两个对象创建一个新对象并返回新对象。<代码> += 不需要创建新对象,它可以直接修改目标对象。C甚至不允许重载操作符<代码> = /COD>。作者不是C++专家。忽略他或她。我认为那篇声明的作者想说他对C++一无所知。特别是他不理解为什么C++中的手动重载<代码> += 有意义,为什么它在C语言中没有意义。你在哪里找到那句话的?第一句话毫无意义,因为C不允许重载运算符
=
。在一种不能重载
=
的语言中,允许重载
+=
毫无意义。因为一个重载
+=
的对象在没有重载
=
的情况下对左侧进行变异,它的语义被严重破坏。C不允许运算符重载,因为它不允许直接指针管理。它的行为是固定的,取决于它是引用还是值type@Ashot:+1,但建议按值传递,而不是按引用传递,然后在函数内部进行复制,按值传递参数为编译器提供了不同的优化机会。@Ben Voigt你是对的,在我的答案的第一个版本中,我通过值传递,但比我想象的要多,这样的代码对于初学者来说看起来有点混乱。在C#中,没有任何东西会被计算两次。但是
E1
的getter和setter都将被评估。@Ben:这就是为什么我说我不知道C#中的规则。谢谢你的信息顺便说一句:-)