条款24:在函数重载(function overloading)和参数缺省化(parameter defaulting)之间,谨慎抉择...

1,引起混淆基于一个事实:他们都允许以不同的形式调用同一个函数名称。
如:
void f(); // f is overloaded

void f(int x);

f(); // calls f()

f(10); // calls f(int)



void g(int x = 0); // g has a default

// parameter value

g(); // calls g(0)

g(10); // calls g(10)

2,应该使用哪个,答案取决于两个方面:
(1)是否有适当的值可以用来作为缺省参数。
(2)希望使用多少个算法.
如果可以选择合理的默认值,而且你需要一个算法,那么最好使用缺省函数。

3,举例
(1)缺省函数的版本:返回最多5个数的最大值
只需要一个即可:
int max(int a,

int b = std::numeric_limits<int>::min(),

int c = std::numeric_limits<int>::min(),

int d = std::numeric_limits<int>::min(),

int e = std::numeric_limits<int>::min())

{

int temp = a > b ? a : b;

temp = temp > c ? temp : c;

temp = temp > d ? temp : d;

return temp > e ? temp : e;

}
(2)如果没有合适的默认值,只能使用函数重载:返回最多5个整数的平均值。
double avg(int a);

double avg(int a, int b);

double avg(int a, int b, int c);

double avg(int a, int b, int c, int d);

double avg(int a, int b, int c, int d, int e)

4,另外一种必须使用函数重载的情况:采用的算法视输入而定.
如:构造函数和拷贝函数
class Natural
{

public:

Natural(int initValue);

Natural(const Natural& rhs);

private:

unsigned int value;

void init(int initValue);

void error(const string& msg);

};

inline

void Natural::init(int initValue) { value = initValue; }

Natural::Natural(int initValue)

{

if (initValue > 0) init(initValue);

else error("Illegal initial value");

}

inline Natural::Natural(const Natural& x)

{ init(x.value); }
//私有成员函数init,避免两个constructors内部部分代码重复。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值