如何在 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