C++中常用的计算两个对象的最大值的三个方法:
1、使用宏定义:
#define max(a,b) ((a) > (b) ? (a) : (b))
这个语句有很多缺陷,无论什么时候你写了象这样的宏,你必须记住在写宏体时对每个参数都要加上括号;
否则,别人调用你的宏时如果用了表达式就会造成很大的麻烦。但是即使你象这样做了,还会有象下面这样奇怪的事发生:
int a = 5, b = 0;
max(++a, b);// a 的值增加了2次
max(++a, b+10); // a 的值只增加了1次
这种情况下,max内部发生些什么取决于它比较的是什么值!
2、使用内联函数实现宏的效率,再加上可预计的行为和类型安全:
不过这和上面的宏不大一样,因为这个版本的max只能处理int类型。
inline int max(int a, int b) { return a > b ? a : b; }
3、使用模板
template<class T>
inline const T& max(const T& a, const T& b)
{ return a > b ? a : b; }
这个模板产生了一整套函数,每个函数拿两个可以转换成同种类型的对象进行比较然后返回较大的(常量)对象的引用。
因为不知道T的类型,返回时传递引用可以提高效率。
当然C++标准库里面也有一个max方法,可以直接使用
1、使用宏定义:
#define max(a,b) ((a) > (b) ? (a) : (b))
这个语句有很多缺陷,无论什么时候你写了象这样的宏,你必须记住在写宏体时对每个参数都要加上括号;
否则,别人调用你的宏时如果用了表达式就会造成很大的麻烦。但是即使你象这样做了,还会有象下面这样奇怪的事发生:
int a = 5, b = 0;
max(++a, b);// a 的值增加了2次
max(++a, b+10); // a 的值只增加了1次
这种情况下,max内部发生些什么取决于它比较的是什么值!
2、使用内联函数实现宏的效率,再加上可预计的行为和类型安全:
不过这和上面的宏不大一样,因为这个版本的max只能处理int类型。
inline int max(int a, int b) { return a > b ? a : b; }
3、使用模板
template<class T>
inline const T& max(const T& a, const T& b)
{ return a > b ? a : b; }
这个模板产生了一整套函数,每个函数拿两个可以转换成同种类型的对象进行比较然后返回较大的(常量)对象的引用。
因为不知道T的类型,返回时传递引用可以提高效率。
当然C++标准库里面也有一个max方法,可以直接使用