欢迎来到天天文库
浏览记录
ID:17957535
大小:27.00 KB
页数:5页
时间:2018-09-11
《条款24:在函数重载和设定参数缺省值间慎重选择》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、条款24:在函数重载和设定参数缺省值间慎重选择条款24:在函数重载和设定参数缺省值间慎重选择会对函数重载和设定参数缺省值产生混淆的原因在于,它们都允许一个函数以多种方式被调用:voidf();//f被重载voidf(intx);f();//调用f()f(10);//调用f(int)voidg(intx=0);//g有一个//缺省参数值g();//调用g(0)g(10);//调用g(10)那么,什么时候该用哪种方法呢?答案取决于另外两个问题。第一,确实有那么一个值可以作为缺省吗?第二,要用到多少种算法?一般来说,如果可以选择一个合适的缺省值并且只是用到一种算法,就使
2、用缺省参数(参见条款38)。否则,就使用函数重载。下面是一个最多可以计算五个int的最大值的函数。这个函数使用了——深呼一口气,看清楚啦——std::numeric_limits::min(),作为缺省参数值。等会儿再进一步介绍这个值,这里先给出函数的代码:intmax(inta,intb=std::numeric_limits::min(),intc=std::numeric_limits::min(),intd=std::numeric_limits::min(),inte=std::numeric_limits::min()){inttemp=a>
3、b?a:b;temp=temp>c?temp:c;temp=temp>d?temp:d;returntemp>e?temp:e;}现在可以放松了。std::numeric_limits::min()是c++标准库用一种特有的新方法所表示的一个在c里已经定义了的东西,即c在中定义的int_min宏所表示的那个东西——处理你的c++原代码的编译器所产生的int的最小可能值。是的,它的句法背离了c所具有的简洁,但在那些冒号以及其它奇怪的句法背后,是有道理可循的。假设想写一个函数模板,其参数为固定数字类型,模板产生的函数可以打印用“实例化类型
4、”表示的最小值。这个模板可以这么写:templatevoidprintminimumvalue(){cout<<表示为t类型的最小值;}如果只是借助和来写这个函数会觉得很困难,因为不知道t是什么,所以不知道该打印int_min还是dbl_min,或其它什么类型的值。为避开这些困难,标准c++库(见条款49)在头文件中定义了一个类模板numeric_limits,这个类模板本身也定义了一些静态成员函数。每个函数返回的是“实例化这个模板的类型”的信息。也就是说,numeric_limits中的函数返回的信
5、息是关于类型int的,numeric_limits中的函数返回的信息是关于类型double的。numeric_limits中有一个函数叫min,min返回可表示为“实例化类型”的最小值,所以numeric_limits::min()返回的是代表整数类型的最小值。有了numeric_limits(和标准库中其它东西一样,numeric_limits存在于名字空间std中;numeric_limits本身在头文件中),写printminimumvalue就可以象下面这样容易:templatevoidprintminimumva
6、lue(){cout<::min的一个很简单的实现:#includenamespacestd{inlineintnumeric_limits::min()throw(){returnint_min;}}因为此函数声明为inlin
7、e,对它的调用会被函数体代替(见条款33)。它只是个int_min,也就是说,它本身仅仅是个简单的“实现时定义的常量”的#define。所以即使本条款开头的那个max函数看起来好象对每个缺省参数进行了函数调用,其实只不过是用了另一种聪明的方法来表示一个类型相关常量而已(本例中常量值为int_min)。象这样一些高效巧妙的应用在c++标准库里俯拾皆是,这可以参考条款49。回到max函数上来:最关键的一点是,不管函数的调用者提供几个参数,max计算时采用的是相同(效率很低)的算法。在函数内部任何地方都不用在意哪些参数是“真”的,哪些是缺省值;而且,所选用的缺省值不可能
8、影响到所采
此文档下载收益归作者所有