定义operator +,=和+ =

时间:2011-03-20 18:10:41

标签: c# c++ operator-overloading

我曾经从C ++笔记中读到以下声明,

  

在C ++中,定义operator +和=并没有给+ =正确的含义。此语言设计错误已在C#

中修复

我想知道这句话到底想说什么?这与运营商过载有关吗?

4 个答案:

答案 0 :(得分:4)

我更喜欢C ++运算符重载机制。根据我的说法,它绝对不是一个设计错误。

+=+=是三个不同的运营商。如果您想使用+=,则需要重载+=。重载+=不会使+=生效。

我想补充一点,在E1 += E2 E1中,就C ++而言,只评估一次。我不知道C#中的确切规则。

答案 1 :(得分:2)

它说,在C#中如果你有重载operator + C#会自动模拟operator + = + +和{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;
}

答案 2 :(得分:0)

这意味着在C ++中,如果您为自己的类定义了自己的运算符+和运算符=,那么这并不意味着您的类将自动支持+=运算符。如果您希望+=运算符适用于您的班级,则必须明确地单独定义+=

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

它在C ++中不起作用。如果您未明确定义+=a += b将导致编译器错误,即使您已定义+=

答案 3 :(得分:0)

C#不允许运算符重载=因为它不允许直接指针管理。它的行为是基于它是引用还是值类型来修复的。出于同样的原因,你不能重载+ =。它的意思总是在做总和和分配。因此,您只能决定+对数据结构的含义。