-2

我试图理解参数默认设置,我让这段代码将 3 个参数传递给一个函数并返回产品。

如何使下面的cout<<"3---... 和“4---”行中的代码使用参数中的默认值?在底部查看我的输出

代码

            #include "stdafx.h"
            #include<iostream>

            using namespace std;

            int product(char str,int a=5, int b=2);

            int _tmain(int argc, _TCHAR* argv[])
            {



                cout<<"1---"<<product('A',40,50)<<endl;

                cout<<"2---"<<product('A')<<endl;
                cout<<"3---"<<product('A',NULL,50)<<endl;
                cout<<"4---"<<product('A',40)<<endl;

                int retValue=product('A',40,50);
                cout<<"5---"<<retValue<<endl;

                system("pause");
                return 0;
            }


            int product(char str,int a, int b){

                return(a*b);
            }

输出

1---2000

2---10

3---0

4---80

5---2000

按任意键继续 。. .

4

2 回答 2

0

我猜在案例 4 中,您希望该值40成为第三个参数。无法使用函数默认参数来执行此操作,顺序就是它定义的顺序。但是,您可以覆盖该函数,以创建一个双参数版本,该版本使用正确的“默认”参数调用三参数函数:

int product(char str, int a, int b)
{
    ...
}

int product(char str, int b = 2)
{
    return product(str, 5, b);
}

对于上面的函数,使用一个或两个参数调用,你调用最后一个函数,但是如果你用三个参数调用它,你调用第一个。

不幸的是,现在没有办法用aset 调用,而是用b上面的方法设置为默认值。相反,您必须为其使用不同的命名函数,或者添加虚拟参数或检查例如参数的特殊值,或者您必须求助于像Boost 参数库这样的“hacks” (正如 chris 所建议的那样)。

于 2013-11-09T17:26:31.213 回答
0

相关代码:

int product(char str,int a=5, int b=2) { return a*b; }

    cout<<"3---"<<product('A',0,50);   // NULL stripped, it's for pointers
    cout<<"4---"<<product('A',40);

给定所需的输出:

3---0
4---80

如果 #3 的示例输出正确,则使用默认值a会得到 250 而不是零。那你的样本输出错了吗?

$ cat t.cpp
#include <iostream>
int product(char c, int a=5, int b=2) { return a*b; }
int main (int c, char **v)
{
    std::cout<<"3---"<<product('A',0,50)<<'\n';
    std::cout<<"4---"<<product('A',40)<<'\n';
}
$ make
g++ -o bin/t -g -O   --std=gnu++11 -march=native -pipe -Wall -Wno-parentheses  t.cpp
$ .bin/t
bash: .bin/t: No such file or directory
$ bin/t
3---0
4---80
$ 
于 2013-11-09T18:34:20.453 回答