考虑功能:
void foo(int a = 3)//named default parameter
void foo1(int = 3)//unnamed default parameter
我理解第一个函数的需要。(“a”的值是3,它可以在程序中使用)。 但是第二个函数(这不是一个错误)已经初始化为3。如果我可以使用此值,我究竟如何使用此值...
答案 0 :(得分:6)
在函数声明/定义中,参数可能有或没有名称,这也适用于具有默认值的参数。
但是要在函数中使用参数,必须提供名称。
通常在声明具有默认参数
的函数时// Unnamed default parameter.
void foo1(int = 3);
在功能定义
中void foo1(int a)
{
std::cout << a << std::endl;
}
然后你可以打电话
foo1(); // the same as call foo1(3)
foo1(2);
答案 1 :(得分:1)
我发现第二个声明在声明基类的空虚方法时非常有用
virtual void doSomething(bool = false) {};
我不想使其成为纯虚拟的,因为在许多派生类中,我不想重新实现它,因此在基类中将其留空。
但是在某些其他派生类中实现此方法时,我需要使用默认值false
。
virtual void doSomething(bool en = false) {};
这没错,但是编译器会给出未使用的参数警告
答案 2 :(得分:0)
在这两种情况下, 3 都会分配给将在函数定义上确定的int
变量。
所以在以后的情况下 - void foo1(int = 3);
// 3被分配给int
- 因为声明变量名称不是必需的
你可以将它与 - void fun(int,int);
联系起来注意:不是从默认参数的角度来看,而是从函数声明的角度来看
//这里我们已经声明了两个int
变量,并且在函数声明时不能强制命名。
修改强>
正如@chethan所指出的那样 - void foo1(int = 3){ }
在函数定义中也是有效的,但是再次使用做一些你以后不能使用的东西(在函数体内)。
例如:
void foo1 (int a, int =2)
{
// do something
// here you wont be able to use your second argument if you haven't gave it any name
}
所以我认为没有意义“不要在函数定义中给出参数名称”。