率,再加上可预计的行为和类型安全,这就是内联函数(见条款 33):
inline int max(int a, int b) { return a > b ? a : b; }
不过这和上面的宏不大一样,因为这个版本的 max 只能处理 int 类型。但模板
可以很轻巧地解决这个问题:
template<class T>
inline const T& max(const T& a, const T& b)
{ return a > b ? a : b; }
这个模板产生了一整套函数,每个函数拿两个可以转换成同种类型的对象
进行比较然后返回较大的(常量)对象的引用。因为不知道 T 的类型,返回时传
递引用可以提高效率(见条款 22)。
顺便说一句,在你打算用模板写象 max 这样有用的通用函数时,先检查一
下标准库(见条款 49),看看他们是不是已经存在。比如说上面说的 max,你会
惊喜地发现你可以后人乘凉:max 是 C++标准库的一部分。
有了 const 和 inline,你对预处理的需要减少了,但也不能完全没有它。抛弃
#include 的日子还很远,#ifdef/#ifndef 在控制编译的过程中还扮演重要角色。
预处理还不能退休,但你一定要计划给它经常放长假。
条款 2:尽量用<iostream>而不用<stdio.h>
是的,scanf 和 printf 很轻巧,很高效,你也早就知道怎么用它们,这我承
认。但尽管他们很有用,事实上 scanf 和 printf 及其系列还可以做些改进。尤其
是,他们不是类型安全的,而且没有扩展性。因为类型安全和扩展性是 C++的
基石,所以你也要服从这一点。另外,scanf/printf 系列函数把要读写的变量和
控制读写格式的信息分开来,就象古老的 FORTRAN 那样。是该向五十年代说
诀别的时候了!
不必惊奇,scanf/printf 的这些弱点正是操作符>>和<<的强项:
int i;
评论0
最新资源