提问者:小点点

在函数中间使用默认值C++


假设这段代码:

#include<stdio.h>    

int t(int a, int b=6, int c=7){
 return b;
}

int main(){    
  
  return 0;  
} 

如何调用T,只传递A和C值,并让B作为默认值?


共2个答案

匿名用户

那是没有办法的。 参数只能按顺序传递,因此不能将默认参数用于显式传递的参数之前的参数。

但是,您可以使用聚合类作为参数,它与默认成员初始值设定项和指定初始值设定项(C++20)相结合,是命名参数传递的良好模拟:

struct Args {
    int a;
    int b = 6
    int c = 7;
};

int t(const Args& args);

int main()
{
    t({
        .a = 42,
        // b will be 6
        .c = 1337,
    });
}

使用指定的初始值设定项并不是强制性的,因此C++20并不是必需的。 只是更简洁,更易读。

根据程序的结构,T作为类的成员函数可能是有意义的。

匿名用户

如果您只想重载b,这将起作用。 如果您的目标是重载c同时,那么您应该去一些更复杂的东西,正如在其他答案中提到的。 ;)

在C++中没有直接的方法可以做到这一点。 尽管您可以链接函数调用(这在以成员作为默认参数实现类方法时非常常用)。

类似于这样的解决方案应该可以很好地工作:

#include<iostream>    

int t(int a, int b, int c) {
  return b;
}

int t(int a, int c) {
  return t(a, 6, c);
}

int main() {    
  auto x = t(1, 2); // this will call t with a = 1, b = 6, c = 2
  std::cout << x;   // prints 6
  return 0;  
} 

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(函数|默认值|c++)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?