是否有一种方法可以在c ++中显式调用可选参数?

问题描述 投票:0回答:4

当我创建一个函数如:

int addThree(int x=1, int y=1, int z=1)

我想调用该函数,以便它使用x和z的默认参数,而不使用y。

addThree(5,,5)addThree(5,NULL,5)进行了一些尝试,但均未有效。希望这些有助于更好地传达我的问题。

感谢任何帮助。干杯!

c++ function optional-parameters optional-arguments
4个回答
2
投票

默认参数必须在列表的最后,因此请执行以下操作

int addThree(int y , int x = 1, int z = 1)
{
    //some stuff
    return someInt;
}

,因此可以将其称为

int ans = addThree(4);

1
投票

如果您始终为一个参数传递值,而对其他参数使用默认值,则可以先将参数重新排列为需要传递的参数,然后再使用默认值。但这仅在您提供值与使用默认值始终相同的情况下才有效。

否则,如果您非常需要与基本功能相似的东西,则可以传递一个类的实例,并让该类实现命名参数惯用法。

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));

这可让您将默认值用于所需的任意多个值,而仅覆盖您实际想要的值。另一方面,它确实增加了相当多的语法开销,因此您必须非常想让该功能烦恼。


0
投票

来自Default arguments

使用默认参数代替缺少的尾随参数在函数调用中:

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);

0
投票

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;
}

不编译,正确会产生歧义错误,因为编译器无法理解应该调用第一个总和还是第二个总和。

© www.soinside.com 2019 - 2024. All rights reserved.