下载
下载
第11章 运算符重载
运算符重载只是一种“语法修饰”,这意味着它是另一种调用函数的方法。
不同之处是对于函数的参数不是出现在圆括号内,而是在我们总认为是运算符的字符的附
近。
但在 C + + 中,可以定义一个和类一起工作的新运算符。除了这个名字函数以关键字
o p e r a t o r开始,以运算符本身结束以外,这个定义和一个普通函数是一样的。这是仅有的差别。
它像其他函数一样也是一个函数,当编译器看到它以适当的模式出现时,就调用它。
11.1 警告和确信
对于运算符重载,人们容易变得过于热心。首先,它是一个娱乐玩具。注意,它仅仅是一
个语法修饰,是另外一种调用函数的方法而已。用这种眼光看,没有理由重载一个运算符,除
非它会使包含我们的类的代码变得更易写,尤其是更易读。(记住,读代码的情况更多)如果
不是这种情况,就不必麻烦去重载运算符。
对于运算符重载,另外一个通常的反映是恐慌:突然, C运算符不再有熟悉的意思。“所有
的东西都改变了,我的所有 C代码将做不同的事情!”但这不是事实。所有用于仅包含内部数
据类型的表达式的运算符是不可能被改变的。我们永远不能重载下面的运算符使执行的行为不
同。
1 << 4;
或者重载运算符使得下面的表达式有意义。
1.414 << 2;
仅仅是包含用户自定义类型的表达式可以有重载的运算符。
11.2 语法
定义一个重载运算符就像定义一个函数,只是该函数的名字是 o p e r a t o r @ ,这里@代表运
算符。函数参数表中参数的个数取决于两个因素:
1) 运算符是一元的(一个参数)还是二元的(两个参数)。
2) 运算符被定义为全局函数(对于一元是一个参数,对于二元是两个参数)还是成员函数
(对于一元没有参数,对于二元是一个参数 — 对象变为左侧参数)。
这里有一个很小的类来显示运算符重载语法。
这两个重载的运算符被定义为内联成员函数。对于二元运算符,单个参数是出现在运算符
右侧的那个。当一元运算符被定义为成员函数时,没有参数。成员函数被运算符左侧的对象调
用。
对于非条件运算符(条件运算符通常返回一个布尔值),如果两个参数是相同的类型,希
望返回和运算相同类型的对象或引用。如果它们不是相同类型,它作什么样的解释就取决于程
序设计者。用这种方法可以组合复杂的表达式:
K += I + J ;
运算符+号产生一个新的整数(临时的),这个整数被用作运算符‘+ =’的r v参数。一旦这
个临时整数不再需要时就被消除。
11.3 可重载的运算符
虽然可以重载几乎所有C中可用的运算符,但使用它们是相当受限制的。特别地,不能结
合C中当前没有意义的运算符(例如 * * 求幂),不能改变运算符的优先级,不能改变运算符的
参数个数。这样限制有意义
—
所有这些行为产生的运算符只会造成意思混淆而不是使之清
楚。
下面两个小部分给出所有“经常用的”运算符的例子,这些被重载的运算符的形式会经常
用到。
11.3.1 一元运算符
下面的例子显示了所有一元运算符重载的语法,它们既以全局函数形式又以成员函数形
式表示。它们将扩充先前显示的类 i n t e g e r和加入新类b y t e。具体运算符的意思取决于如何使用
它们。
第11章 运算符重载 195
下载
196 C + +编程思想
下载
第11章 运算符重载 197
下载
评论0