个右侧参数 , 因为对象自己成了左侧参数 。
从语法上讲 , 运算符既可以定义为全局函数 , 也可以定义为成员函数 。文献[Murray ,
p44-p47]对此问题作了较多的阐述 , 并总结了表 8-4-1 的规则 。
运算符
规则
所有的一元运算符
建议重载为成员函数
= () [] ->
【C++高级编程之——函数重载、内联、缺省参数、隐式转换】只能重载为成员函数
+= -= /= *= &= |= ~= %= >>= <<=
建议重载为成员函数
所有其它运算符
建议重载为全局函数
表 8-4-1 运算符的重载规则
由于 C++语言支持函数重载 , 才能将运算符当成函数来用 , C 语言就不行 。我们要以平常心来对待运算符重载:
(1)不要过分担心自己不会用 , 它的本质仍然是程序员们熟悉的函数 。
(2)不要过分热心地使用 , 如果它不能使代码变得更加易读易写 , 那就别用 , 否则会自找麻烦 。
8.4.2 不能被重载的运算符
在 C++运算符集合中 , 有一些运算符是不允许被重载的 。这种限制是出于安全方面的考虑 , 可防止错误和混乱 。
(1)不能改变 C++内部数据类型(如 int,float 等)的运算符 。
(2)不能重载‘.’ , 因为‘.’在类中对任何成员都有意义 , 已经成为标准用法 。
(3)不能重载目前 C++运算符集合中没有的符号 , 如#,@,$等 。原因有两点 , 一是难以理解 , 二是难以确定优先级 。
(4)对已经存在的运算符进行重载时 , 不能改变优先级规则 , 否则将引起混乱 。
8.5 函数内联
8.5.1 用内联取代宏代码
C++ 语言支持函数内联 , 其目的是为了提高函数的执行效率(速度) 。
在 C 程序中 , 可以用宏代码提高执行效率 。宏代码本身不是函数 , 但使用起来象函数 。预处理器用复制宏代码的方式代替函数调用 , 省去了参数压栈、生成汇编语言的 CALL调用、返回参数、执行 return 等过程 , 从而提高了速度 。使用宏代码最大的缺点是容易出错 , 预处理器在复制宏代码时常常产生意想不到的边际效应 。例如
#define MAX(a, b) (a) > (b) ? (a) : (b)
语句
result = MAX(i, j) + 2 ;
将被预处理器解释为
result = (i) > (j) ? (i) : (j) + 2 ;
由于运算符‘+’比运算符‘:’的优先级高 , 所以上述语句并不等价于期望的
result = ( (i) > (j) ? (i) : (j) ) + 2 ;
如果把宏代码改写为
#define MAX(a, b) ( (a) > (b) ? (a) : (b) )
则可以解决由优先级引起的错误 。但是即使使用修改后的宏代码也不是万无一失的 , 例
如语句
result = MAX(i++, j);
将被预处理器解释为
result = (i++) > (j) ? (i++) : (j);
对于 C++ 而言 , 使用宏代码还有另一种缺点:无法操作类的私有数据成员 。
让我们看看 C++ 的“函数内联”是如何工作的 。对于任何内联函数 , 编译器在符号
表里放入函数的声明(包括名字、参数类型、返回值类型) 。如果编译器没有发现内联
函数存在错误 , 那么该函数的代码也被放入符号表里 。在调用一个内联函数时 , 编译器
首先检查调用是否正确(进行类型安全检查 , 或者进行自动类型转换 , 当然对所有的函
数都一样) 。如果正确 , 内联函数的代码就会直接替换函数调用 , 于是省去了函数调用
的开销 。这个过程与预处理有显著的不同 , 因为预处理器不能进行类型安全检查 , 或者
进行自动类型转换 。假如内联函数是成员函数 , 对象的地址(this)会被放在合适的地
方 , 这也是预处理器办不到的 。
C++ 语言的函数内联机制既具备宏代码的效率 , 又增加了安全性 , 而且可以自由操
作类的数据成员 。所以在 C++ 程序中 , 应该用内联函数取代所有宏代码 , “断言 assert”
恐怕是唯一的例外 。assert 是仅在 Debug 版本起作用的宏 , 它用于检查“不应该”发生
的情况 。为了不在程序的 Debug 版本和 Release 版本引起差别 , assert 不应该产生任何
推荐阅读
- 腾讯T8架构师,教你学中小研发团队架构实践PDF,高级架构师捷径
- 如何基于TCP/IP协议进行MFC Socket网络通讯编程
- 学习 Shell 脚本编程的免费资源 | Linux 中国
- 从茶场到标准化生产线,浙江省高级农艺师到缙指导黄茶产业提升项目
- 应该学习的前5种编程语言
- 2020年树莓派的5种最佳编程语言
- 聊聊Java中的异常及处理
- 基于XML描述的可编程函数式ETL实现
- 50个C语言/C++程序员必会遇到的疑难解答
- 对话高级评茶师,当普通茶人遇上专业评茶师
