📜  C++中的默认参数

📅  最后修改于: 2021-05-30 05:03:46             🧑  作者: Mango

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

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

#include
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 
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++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”