返回介绍

8.3 默认参数

发布于 2024-10-08 23:14:07 字数 3287 浏览 0 评论 0 收藏 0

下面介绍 C++的另一项新内容——默认参数。默认参数指的是当函数调用中省略了实参时自动使用的一个值。例如,如果将 void wow(int n)设置成 n 有默认值为 1,则函数调用 wow( ) 相当于 wow(1)。这极大地提高了使用函数的灵活性。假设有一个名为 left( ) 的函数,它将字符串和 n 作为参数,并返回该字符串的前 n 个字符。更准确地说,该函数返回一个指针,该指针指向由原始字符串中被选中的部分组成的字符串。例如,函数调用 left(“theory”, 3) 将创建新字符串“the”,并返回一个指向该字符串的指针。现在假设第二个参数的默认值被设置为 1,则函数调用 left(“theory”, 3) 仍像前面讲述的那样工作,3 将覆盖默认值。但函数调用 left(“theory”) 不会出错,它认为第二个参数的值为 1,并返回指向字符串“t”的指针。如果程序经常需要抽取一个字符组成的字符串,而偶尔需要抽取较长的字符串,则这种默认值将很有帮助。

如何设置默认值呢?必须通过函数原型。由于编译器通过查看原型来了解函数所使用的参数数目,因此函数原型也必须将可能的默认参数告知程序。方法是将值赋给原型中的参数。例如,left( ) 的原型如下:

您希望该函数返回一个新的字符串,因此将其类型设置为 char *(指向 char 的指针);您希望原始字符串保持不变,因此对第一个参数使用了 const 限定符;您希望 n 的默认值为 1,因此将这个值赋给 n。默认参数值是初始化值,因此上面的原型将 n 初始化为 1。如果省略参数 n,则它的值将为 1;否则,传递的值将覆盖 1。

对于带参数列表的函数,必须从右向左添加默认值。也就是说,要为某个参数设置默认值,则必须为它右边的所有参数提供默认值:

例如,harpo( ) 原型允许调用该函数时提供 1 个、2 个或 3 个参数:

实参按从左到右的顺序依次被赋给相应的形参,而不能跳过任何参数。因此,下面的调用是不允许的:

默认参数并非编程方面的重大突破,而只是提供了一种便捷的方式。在设计类时您将发现,通过使用默认参数,可以减少要定义的析构函数、方法以及方法重载的数量。

程序清单 8.9 使用了默认参数。请注意,只有原型指定了默认值。函数定义与没有默认参数时完全相同。

程序清单 8.9 left.cpp

下面是该程序的运行情况:

程序说明

该程序使用 new 创建一个新的字符串,以存储被选择的字符。一种可能出现的尴尬情况是,不合作的用户要求的字符数目可能为负。在这种情况下,函数将字符计数设置为 0,并返回一个空字符串。另一种可能出现的尴尬情况是,不负责任的用户要求的字符数目可能多于字符串包含的字符数,为预防这种情况,函数使用了一个组合测试:

i < n 测试让循环复制了 n 个字符后终止。测试的第二部分——表达式 str[i],是要复制的字符的编码。遇到空值字符(其编码为 0)后,循环将结束。这样,while 循环将使字符串以空值字符结束,并将余下的空间(如果有的话)设置为空值字符。

另一种设置新字符串长度的方法是,将 n 设置为传递的值和字符串长度中较小的一个:

这将确保 new 分配的空间不会多于存储字符串所需的空间。如果用户执行像 left(“Hi!”, 32767) 这样的调用,则这种方法很有用。第一种方法将把“Hi!”复制到由 32767 个字符组成的数组中,并将除前 3 个字符之外的所有字符都设置为空值字符;第二种方法将“Hi!”复制到由 4 个字符组成的数组中。但由于添加了另外一个函数调用(strlen( )),因此程序将更长,运行速度将降低,同时还必须包含头文件 cstring(或 string.h)。C 程序员倾向于选择运行速度更快、更简洁的代码,因此需要程序员在正确使用函数方面承担更多责任。然而,C++的传统是更强调可靠性。毕竟,速度较慢但能正常运行的程序,要比运行速度虽快但无法正常运行的程序好。如果调用 strlen( ) 所需的时间很长,则可以让 left( ) 直接确定 n 和字符串长度哪个小。例如,当 m 的值等于 n 或到达字符串结尾时,下面的循环都将终止:

别忘了,在 str[m]不是空值字符时,表达式 str[m] != '\0'的结果为 true,否则为 false。由于在&&表达式中,非零值被转换为 true,而零被转换为 false,因此也可以这样编写这个 while 测试:

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文