繁体   English   中英

定义运算符+,=和+ =

[英]defining operator + , = and +=

我曾经从C ++注释中阅读以下语句,

在C ++中,定义运算符+和=不能赋予+ =正确的含义。 此语言设计错误已在C#中修复

我想知道这句话到底想说什么? 这与操作员过载有关吗?

我更喜欢C ++运算符重载机制。 对我来说,这绝对不是设计错误。

+=+=是三个不同的运算符。 如果要使用+= ,则需要重载+= 重载+=将使+=无效。

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

它说,在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 ++中,如果您为类定义了自己的运算符+和operator = ,这仍然并不意味着您的类将自动支持+=运算符。 如果要让+=运算符为您的类工作,则必须显式且单独定义+=

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

在C ++中,这种方式不起作用。 如果没有显式定义+= ,则即使已定义+=a += b也会导致编译器错误。

C#不允许运算符重载=,因为它不允许直接指针管理。 它的行为基于引用还是值类型而固定。 出于同样的原因,您不能重载+ =。 这意味着将始终进行求和与赋值。 因此,您只能确定+对您的数据结构意味着什么。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM