我是否错误地使用了默认参数?

9

我刚开始学习C++的入门书籍。我有一些Java经验(但说实话,我从未在Java中使用默认参数)。

所以,正如之前提到的,我的问题出在默认参数上...

这是我正在使用的代码片段:

#include <iostream>

using namespace std;

//add declaration
int add(int a, int b);

int main (void)
{
        int number1;

        cout << "Enter the first value to be summed: ";
        cin >> number1;
        cout << "\nThe sum is: " << add(number1) << endl;
}

int add(int a=10, int b=5)
{
        return a+b;
}

我从g++编译器得到的反馈是:"函数'int add(int, int)'参数过少"

我做错了吗?(我也试过使用字面量参数)

顺便说一句,代码片段似乎无法正常显示?系统改变了吗?


4
默认参数在声明时设置。为了格式化代码,请将其粘贴进来,不要使用任何反引号,全选高亮代码,然后点击 {} 按钮。 - chris
2
非常感谢各位先生们。我很欣赏能够在这个社区内几秒钟之内解决问题的事实。 - yoonsi
不使用默认参数有很多好的理由:https://quuxplusone.github.io/blog/2020/04/18/default-function-arguments-are-the-devil/, https://dev59.com/mKzla4cB1Zd3GeqPCtKl#51297175 - hlovdal
1个回答

23

相反的情况才是正确的。

//add declaration
int add(int a=10, int b=5);


int add(int a, int b)
{
   return a+b;
}

§ 8.3.6 默认参数 默认参数只能在函数声明的parameter-declaration-clause或template-parameter中指定。对于参数包,不得指定默认参数。


9
如果你想知道为什么,那是因为编译器需要在调用时知道默认值。函数体可能会在另一个文件中,因此该信息将不可用。 - Mark Ransom
值得注意的是,在这种情况下,变量名a仅在函数定义中需要(这样可以更容易地阅读和编辑,特别是当分开使用.h和.cpp文件时)。声明将如下所示:int add(int = 10, int = 5);,而定义头则简单地为int add(int a, int b)。此外,在定义的参数列表后应删除分号。 - Logan Besecker
请不要批准像这样的建议编辑。如果需要,请参考此元帖了解详情。 - Himanshu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接