【C++】默认实参(缺省参数)
创始人
2025-05-31 23:11:20
0

内容来自《C++ Primer(第5版)》6.5.1 默认实参


目录

使用默认实参调用函数

默认实参声明

默认实参初始值


某些函数有这样一种形参,在函数的很多次调用中它们都被赋予一个相同的值,此时,我们把这个反复出现的值称为函数的默认实参(default argument)。调用含有默认实参的函数时,可以包含该实参,也可以省略该实参。

例如,我们使用string对象表示窗口的内容。一般情况下,我们希望该窗口的高、宽和背景字符都使用默认值。但是同时我们也应该允许用户为这几个参数自由指定与默认值不同的数值。为了使得窗口函数既能接纳默认值,也能接受用户指定的值,我们把它定义成如下的形式:

typedef string::size_type sz;
string screen(sz ht = 24, sz wid = 80,char backgrnd = ' ');

其中我们为每一个形参都提供了默认实参,默认实参作为形参的初始值出现在形参列表中。我们可以为一个或多个形参定义默认值,不过需要注意的是,一旦某个形参被赋予了默认值,它后面的所有形参都必须有默认值。

使用默认实参调用函数

如果我们想使用默认实参,只要在调用函数的时候省略该实参就可以了。例如,screen函数为它的所有形参都提供了默认实参,所以我们可以使用0、1、2或3个实参调用该函数:

string window;
window = screen();          //等价于screen(24,80,' ')
window = screen(66);        //等价于screen(66,80,' ')
window = screen(66,256);   //screen(66,256,' ')
window = screen(66,256,'#’);//screen(66,256,'#')

函数调用时实参按其位置解析,默认实参负责填补函数调用缺少的尾部实参(靠右侧位置)。例如,要想覆盖backgrnd的默认值,必须为ht和wid提供实参:

window = screen(, , '?');//错误:只能省略尾部的实参
window = screen('?');    //调用screen('?’,80,' ')

需要注意,第二个调用传递一个字符值,是合法的调用。然而尽管如此,它的实际效果却与书写的意图不符。该调用之所以合法是因为'?'是个char,而函数最左侧形参的类型string::size_type是一种无符号整数类型,所以char类型可以转换成函数最左侧形参的类型。当该调用发生时,char类型的实参隐式地转换成string::size_type,然后作为height的值传递给函数。在我们的机器上,'?'对应的十六进制数是0x3F,也就是十进制数的63,所以该调用把值63传给了形参height。

当设计含有默认实参的函数时,其中一项任务是合理设置形参的顺序,尽量让不怎么使用默认值的形参出现在前面,而让那些经常使用默认值的形参出现在后面。

默认实参声明

对于函数的声明来说,通常的习惯是将其放在头文件中,并且一个函数只声明一次,但是多次声明同一个函数也是合法的。不过有一点需要注意,在给定的作用域中一个形参只能被赋予一次默认实参。换句话说,函数的后续声明只能为之前那些没有默认值的形参添加默认实参,而且该形参右侧的所有形参必须都有默认值。假如给定

//表示高度和宽度的形参没有默认值
string screen(sz, sz, char = ' ');

我们不能修改一个已经存在的默认值:

string screen(sz, sz, char = '*');//错误:重复声明

但是可以按照如下形式添加默认实参:

string screen(sz = 24, sz = 80, char);//正确:添加默认实参

Best Practices

通常,应该在函数声明中指定默认实参,并将该声明放在合适的头文件中。

默认实参初始值

局部变量不能作为默认实参。除此之外,只要表达式的类型能转换成形参所需的类型,该表达式就能作为默认实参:

//wd、def和ht的声明必须出现在函数之外
sz wd = 80;
char def = ' ';
sz ht();
string screen(sz = ht(), sz = wd, char = def);
string window = screen();//调用screen(ht(),80,' ')

用作默认实参的名字在函数声明所在的作用域内解析,而这些名字的求值过程发生在函数调用时:

void f2
{def = '*’;        //改变默认实参的值sz wd =100;       //隐藏了外层定义的wd,但是没有改变默认值window = screen();//调用screen(ht(),80,'*')
}

我们在函数f2内部改变了def的值,所以对screen的调用将会传递这个更新过的值。另一方面,虽然我们的函数还声明了一个局部变量用于隐藏外层的wd,但是该局部变量与传递给screen的默认实参没有任何关系。

相关内容

热门资讯

AI大牛股,停牌核查!多只A股... 近期,随着市场波动的加大,提示交易风险的公司也逐渐多了起来。1月14日晚间,易点天下公告,公司将就股...
中信证券业绩快报:归母净利润创... 1月14日晚,中信证券发布了2025年的业绩快报。数据显示,中信证券实现营业收入748.3亿元,同比...
国产存储“双子星”浮现:兆易创... 1月13日,国产存储芯片龙头兆易创新成功登陆香港交易所主板。上市首日,其股价报收222.8港元,较发...
瑞尔竞达二次闯关北交所IPO成... 1月14日,北京证券交易所(简称“北交所”)上市委员会(简称“上市委”)今年第3次审议会议结果出炉,...
易点天下:公司目前不涉及GEO... 新京报贝壳财经讯 1月14日,易点天下公告,公司目前不涉及GEO业务,敬请广大投资者注意二级市场交易...
特朗普最新表态!丹麦军方开始向... 每经编辑:黄胜 央视新闻据丹麦方面14日消息,丹麦军方已开始向格陵兰岛运送军事物资并派出先遣分队,为...
寿司郎赢得毫不费力 订阅 快刀财经 ▲ 做您的私人商学院平价寿司不平价,回转寿司不回转。作者:罗雪妍来源:远川研究所(I...
港交所对星悦康旅及中国奥园作出... 1月13日,香港联合交易所有限公司对星悦康旅股份有限公司(更名前:奥园健康生活集团有限公司,股份代号...
曾经的光伏组件行业“第一股”陷... 2026.01.14本文字数:2179,阅读时长大约4分钟作者 |第一财经 魏中原1月13日晚,曾经...
中胤时尚:因募集资金管理违规,... 1月14日,中胤时尚(300901.SZ)发布公告称,近日收到中国证券监督管理委员会浙江监管局(以下...