[英]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.