我曾经从C ++笔记中读到以下声明,
在C ++中,定义operator +和=并没有给+ =正确的含义。此语言设计错误已在C#
中修复
我想知道这句话到底想说什么?这与运营商过载有关吗?
答案 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#不允许运算符重载=因为它不允许直接指针管理。它的行为是基于它是引用还是值类型来修复的。出于同样的原因,你不能重载+ =。它的意思总是在做总和和分配。因此,您只能决定+对数据结构的含义。