当我创建一个函数如:
int addThree(int x=1, int y=1, int z=1)
我想调用该函数,以便它使用x和z的默认参数,而不使用y。
addThree(5,,5)
和addThree(5,NULL,5)
进行了一些尝试,但均未有效。希望这些有助于更好地传达我的问题。
感谢任何帮助。干杯!
默认参数必须在列表的最后,因此请执行以下操作
int addThree(int y , int x = 1, int z = 1)
{
//some stuff
return someInt;
}
,因此可以将其称为
int ans = addThree(4);
如果您始终为一个参数传递值,而对其他参数使用默认值,则可以先将参数重新排列为需要传递的参数,然后再使用默认值。但这仅在您提供值与使用默认值始终相同的情况下才有效。
否则,如果您非常需要与基本功能相似的东西,则可以传递一个类的实例,并让该类实现命名参数惯用法。
class triplet {
int x_ {1};
int y_ {1};
int z_ {1};
public:
triplet &x(int val) { x_ = val; return *this; }
triplet &y(int val) { y_ = val; return *this; }
triplet &z(int val) { z_ = val; return *this; }
int x() const { return x_; }
int y() const { return y_; }
int z() const { return z_; }
};
int addThree(triplet const &t) {
return oldAddThree(t.x(), t.y(), t.z());
}
int ans = addThree(triplet().x(4));
这可让您将默认值用于所需的任意多个值,而仅覆盖您实际想要的值。另一方面,它确实增加了相当多的语法开销,因此您必须非常想让该功能烦恼。
使用默认参数代替缺少的尾随参数在函数调用中:
void point(int x = 3, int y = 4);
point(1,2); // calls point(1,2)
point(1); // calls point(1,4)
point(); // calls point(3,4)
如果要使用y的默认值,则重新定义为
int addThree(int x = 1, int z = 1, int y = 1);
并拨打电话
addThree(5,5);
C ++中的默认参数,需要立即连续指定,并且不能由非默认参数继承。
所以,类似
int sum(int x = 0, int y, int z = 0) {
return (x + y + z);
}
在C ++中被禁止
该功能必须如下:
#include <iostream>
int sum(int x, int y = 0, int z = 0) {
return (x + y + z);
}
int main() {
std::cout << sum(1) << "\n";//calls sum(1,0,0)
std::cout << sum(1,2) << "\n";//calls sum(1,2,0)
return 0;
}
但是,在指定默认参数时,始终需要注意函数重载。重载的函数不能被模糊地调用。
所以是这样的代码:
#include <iostream> int sum(int x, int y = 0, int z = 0) { return (x + y + z); } float sum(int x, float y = 0.0, float z = 0.0) { return (float(x) + y + z); } int main() { std::cout << sum(1) << "\n"; return 0; }
不编译,正确会产生歧义错误,因为编译器无法理解应该调用第一个总和还是第二个总和。