3 回答
TA贡献1844条经验 获得超8个赞
C ++中运算符重载的三个基本规则
当谈到C ++中的运算符重载时,您应该遵循三个基本规则。与所有此类规则一样,确实存在例外情况。有时人们偏离了他们,结果并不是糟糕的代码,但这种积极的偏差很少。至少,我所看到的100个这样的偏差中有99个是没有道理的。但是,它可能只有1000中的999。所以你最好坚持以下规则。
只要操作员的意义不明显且无可争议,就不应该超载。 相反,提供具有良好选择名称的功能。
基本上,重载运营商的第一个也是最重要的规则是:不要这样做。这可能看起来很奇怪,因为有很多关于运算符重载的知识,因此很多文章,书籍章节和其他文本都涉及到这一切。但尽管有这些看似明显的证据,但只有极少数情况下运营商超载是合适的。原因是实际上很难理解运算符应用背后的语义,除非在应用程序域中使用运算符是众所周知且无可争议的。与普遍看法相反,情况并非如此。始终坚持运营商众所周知的语义。
C ++对重载运算符的语义没有限制。您的编译器将很乐意接受实现二元+
运算符的代码从其右操作数中减去。然而,这样的运营商的用户将不会怀疑表达a + b
减去a
从b
。当然,这假设应用程序域中的运算符的语义是无可争议的。始终提供一系列相关操作。
运营商彼此之间以及与其他运营相关。如果您的类型支持a + b
,用户也可以打电话a += b
。如果它支持前缀增量++a
,它们也a++
可以工作。如果他们可以检查是否a < b
,他们肯定也希望能够检查是否a > b
。如果他们可以复制构造您的类型,他们希望分配也可以工作。
TA贡献1780条经验 获得超5个赞
C ++中运算符重载的通用语法
您无法在C ++中更改内置类型的运算符的含义,只能为用户定义的类型1重载运算符。也就是说,至少一个操作数必须是用户定义的类型。与其他重载函数一样,运算符只能为一组参数重载一次。
并非所有运算符都可以在C ++中重载。在无法重载的运算符中有:.
::
sizeof
typeid
.*
和C ++中唯一的三元运算符,?:
可以在C ++中重载的运算符包括:
算术运算符:
+
-
*
/
%
和+=
-=
*=
/=
%=
(所有二进制中缀);+
-
(一元前缀);++
--
(一元前缀和后缀)位操作:
&
|
^
<<
>>
和&=
|=
^=
<<=
>>=
(所有二进制中缀);~
(一元前缀)boolean algebra :(
==
!=
<
>
<=
>=
||
&&
所有二进制中缀);!
(一元前缀)内存管理:
new
new[]
delete
delete[]
隐式转换运算符
miscellany :(
=
[]
->
->*
,
所有二进制中缀);*
&
(所有一元前缀)()
(函数调用,n-ary中缀)
但是,你可以超载所有这些并不意味着你应该这样做。请参阅运算符重载的基本规则。
在C ++中,运算符以具有特殊名称的函数形式重载。为具有其他功能,重载操作符可以通常被实现为一个其左操作数的类型的成员函数或作为非成员函数。您是否可以自由选择或限制使用其中任何一个取决于几个标准。2应用于对象x的一元运算符@
3可以作为operator@(x)
或作为调用x.operator@()
。二元缀运算符@
,施加到对象x
和y
被称为或者作为operator@(x,y)
或作为x.operator@(y)
。4
实现为非成员函数的运算符有时是其操作数类型的朋友。
1 “用户定义”一词可能略有误导。C ++区分内置类型和用户定义类型。前者属于例如int,char和double;后者属于所有struct,class,union和enum类型,包括来自标准库的类型,即使它们不是由用户定义的。
2 这是覆盖在后面的部分这个常见问题。
3 这@
不是C ++中的有效运算符,这就是我将其用作占位符的原因。
4 C ++中唯一的三元运算符不能重载,唯一的n-ary运算符必须始终作为成员函数实现。
- 3 回答
- 0 关注
- 1045 浏览
添加回答
举报