C++中函数的默认参数用法指南

2021年3月17日14:56:18 发表评论 801 次浏览

默认参数是函数声明中提供的值, 如果函数的调用者未提供具有默认值的参数值, 则该值由编译器自动分配。

以下是一个简单的C ++示例, 以演示默认参数的用法。我们不必编写3个求和函数, 只需将第3个和第4个参数使用默认值即可使用一个函数。

#include<iostream>
using namespace std;
  
// A function with default arguments, it can be called with 
// 2 arguments or 3 arguments or 4 arguments.
int sum( int x, int y, int z=0, int w=0)
{
     return (x + y + z + w);
}
  
/* Driver program to test above function*/
int main()
{
     cout << sum(10, 15) << endl;
     cout << sum(10, 15, 25) << endl;
     cout << sum(10, 15, 25, 30) << endl;
     return 0;
}

输出如下:

25
50
80

函数重载与默认值一起完成时。然后, 我们需要确保它不会模棱两可。

如果模棱两可, 编译器将抛出错误。以下是上述程序的修改版本。

#include<iostream> 
using namespace std; 
  
// A function with default arguments, it can be called with 
// 2 arguments or 3 arguments or 4 arguments. 
int sum( int x, int y, int z=0, int w=0) 
{ 
     return (x + y + z + w); 
} 
int sum( int x, int y, float z=0, float w=0) 
{ 
     return (x + y + z + w); 
} 
/* Driver program to test above function*/
int main() 
{ 
     cout << sum(10, 15) << endl; 
     cout << sum(10, 15, 25) << endl; 
     cout << sum(10, 15, 25, 30) << endl; 
     return 0; 
}

错误:

prog.cpp: In function 'int main()':
prog.cpp:17:20: error: call of overloaded 
'sum(int, int)' is ambiguous
  cout << sum(10, 15) << endl; 
                    ^
prog.cpp:6:5: note: candidate: 
int sum(int, int, int, int)
 int sum(int x, int y, int z=0, int w=0) 
     ^
prog.cpp:10:5: note: candidate: 
int sum(int, int, float, float)
 int sum(int x, int y, float z=0, float w=0) 
     ^

关键点:

  • 默认参数与常量参数不同, 因为不能更改常量参数, 而如果需要可以覆盖默认参数。
  • 调用函数为其提供值时, 默认参数将被覆盖。例如, 调用函数sum(10, 15, 25, 30)会将z和w的值分别覆盖为25和30。
  • 在调用函数期间, 从调用函数到被调用函数的参数从左到右复制。因此, sum(10、15、25)会将10、15和25分配给x, y和z。因此, 默认值仅用于w。
  • 将默认值用于函数定义中的参数后, 该参数的所有后续参数都必须具有默认值。也可以说默认参数是从右到左分配的。例如, 以下函数定义无效, 因为默认变量z的后续参数不是默认变量。
// Invalid because z has default value, but w after it 
// doesn't have default value
int sum( int x, int y, int z=0, int w)

如果发现任何不正确的地方, 或者想分享有关上述主题的更多信息, 请写评论。

被认为是行业中最受欢迎的技能之一, 我们拥有自己的编码基础C ++ STL通过激烈的问题解决过程来训练和掌握这些概念。

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: