如何在 C++ 中使用默认参数?
how to use default arguments in c++?
在python我可以写:
def test(a, b=None):
if b is None:
return
else:
print(123)
在cpp中,最好避免指针,所以我用引用代替,
那么如何做同样的事情呢?
#include "stdio.h"
void test(int a, const int &b) {
// how to check ?? since b should not be nullptr
printf("123\n"); };
int main() { test(); }
in cpp, it's better to avoid pointers, so I use reference instead
引用不能引用 NULL
,因此指针 是 的传统方式,例如void test(int a, const int *b=NULL)
。鼓励引用而不是指针的大部分原因是因为它 使您免于 处理 NULL
个参数;如果您需要 NULL
个论点,引用并不能使您免于任何麻烦。
std::optional
is sometimes used for similar scenarios,但它要新得多(C++17),我认为对于它是否更可取并没有达成强烈的共识;就是说,将它与 std::nullopt
一起使用作为默认值接近于您已经拥有的,并且是处理问题的合理方法。
备选方案(在上述链接问题的答案中提到)只是重载函数两次,一次带参数,一次不带;这可以与 std::optional
方法相结合,以允许更简单的用户调用仅传递一个参数(使用默认值,生成的代码在依赖它的每个调用站点内联创建默认参数),但仍然实现通过公共代码的函数(单参数函数只是转身并调用双参数函数)。
C++ 引用不能 NULL
。它们总是指向有效的对象,在声明期间初始化。
如其他答案中所述,C++ 中不允许使用 NULL 引用,因此您不能将 NULL 用作按引用参数的默认值,std::optional
将是一个不错的选择相反。
虽然你可以定义你自己的哨兵对象,以执行与 NULL 相同的功能,但实际上不是 NULL 引用,如下所示:
#include "stdio.h"
const int & get_sentinel_ref()
{
static int sentinel = 0; // must be declared static
return sentinel; // in order to have a fixed address
}
void test(int a, const int &b = get_sentinel_ref())
{
// Check if b is referring to our sentinel-value or not
// Note that I'm comparing memory-addresses here, not values
// otherwise the code would do the wrong thing if the user
// passed in zero (or whatever dummy-value sentinel is set
// to in the get_sentinel_ref() function above)
if (&b == &get_sentinel_ref())
{
printf("a is %i, but you didn't supply a second argument!\n", a);
}
else
{
printf("a is %i, b is %i\n", a, b);
}
}
int main(int, char **)
{
test(5);
test(6,7);
return 0;
}
... 当运行时,上面的程序打印:
a is 5, but you didn't supply a second argument!
a is 6, b is 7
在python我可以写:
def test(a, b=None):
if b is None:
return
else:
print(123)
在cpp中,最好避免指针,所以我用引用代替,
那么如何做同样的事情呢?
#include "stdio.h"
void test(int a, const int &b) {
// how to check ?? since b should not be nullptr
printf("123\n"); };
int main() { test(); }
in cpp, it's better to avoid pointers, so I use reference instead
引用不能引用 NULL
,因此指针 是 的传统方式,例如void test(int a, const int *b=NULL)
。鼓励引用而不是指针的大部分原因是因为它 使您免于 处理 NULL
个参数;如果您需要 NULL
个论点,引用并不能使您免于任何麻烦。
std::optional
is sometimes used for similar scenarios,但它要新得多(C++17),我认为对于它是否更可取并没有达成强烈的共识;就是说,将它与 std::nullopt
一起使用作为默认值接近于您已经拥有的,并且是处理问题的合理方法。
备选方案(在上述链接问题的答案中提到)只是重载函数两次,一次带参数,一次不带;这可以与 std::optional
方法相结合,以允许更简单的用户调用仅传递一个参数(使用默认值,生成的代码在依赖它的每个调用站点内联创建默认参数),但仍然实现通过公共代码的函数(单参数函数只是转身并调用双参数函数)。
C++ 引用不能 NULL
。它们总是指向有效的对象,在声明期间初始化。
如其他答案中所述,C++ 中不允许使用 NULL 引用,因此您不能将 NULL 用作按引用参数的默认值,std::optional
将是一个不错的选择相反。
虽然你可以定义你自己的哨兵对象,以执行与 NULL 相同的功能,但实际上不是 NULL 引用,如下所示:
#include "stdio.h"
const int & get_sentinel_ref()
{
static int sentinel = 0; // must be declared static
return sentinel; // in order to have a fixed address
}
void test(int a, const int &b = get_sentinel_ref())
{
// Check if b is referring to our sentinel-value or not
// Note that I'm comparing memory-addresses here, not values
// otherwise the code would do the wrong thing if the user
// passed in zero (or whatever dummy-value sentinel is set
// to in the get_sentinel_ref() function above)
if (&b == &get_sentinel_ref())
{
printf("a is %i, but you didn't supply a second argument!\n", a);
}
else
{
printf("a is %i, b is %i\n", a, b);
}
}
int main(int, char **)
{
test(5);
test(6,7);
return 0;
}
... 当运行时,上面的程序打印:
a is 5, but you didn't supply a second argument!
a is 6, b is 7