August 2021
Intermediate to advanced
450 pages
9h 36m
Chinese
你可以在类或枚举对象上定义几乎所有C++运算符,这通常称为运算符重载(operator overloading)。这种机制用于为用户自定义类型提供习惯的符号表示方法。如下例:
其中:是“算术if”运算符:当(m==Dec)时m的值变为Jan,否则m的值为Month(int(m)+1)。这是对十二月后继月份“绕回”一月这一特性的一种非常简洁的描述方法。现在,我们可以像如下代码一样使用Month类型:
你可能觉得增加Month对象值这样的操作没那么常用,不至于设计一个专门的运算符。可能确实是这样,那么输出运算符又如何呢?如下代码定义了一个输出运算符:
这里假定month_tbl已经在其他位置进行了初始化,每个数组元素保存了对应月份的恰当的名字,如month_tbl[int(Month::mar)]的值为字符串“March”或其他合适的名字;参见10.11.3节。
你可以为自己的类型重新定义几乎所有的C++运算符,如+、-、*、/、%、[]、()、^、!、&、<、<=、>、>=等等。不能定义新的运算符,你可能想在程序中把**或$=作为运算符,但C++不允许你这样做。而且,重载运算符时,运算对象数目也必须与原来一样。例如,你可以定义一元运算符-,但不能定义一元的<=(小于等于),你可以定义二元运算符+,但不能定义二元的!(非)。原则上,C++允许你对自定义类型使用已有的语法,但不允许扩展语法。 ...