提问者:小点点

重写函数中的参数-调用operator()C++


我在IonizationTunnel.h文件中遇到了这个被重写的函数调用操作符():

void operator()(Particles *, std::vector<double>*, unsigned int,  int ipart_ref = 0) override;

这与Ionization.h文件中的虚拟void运算符()的参数完全匹配:

virtual void operator()(Particles *, std::vector<double>*, unsigned int,  int ipart_ref = 0) {}

电离是基类。IonizationTunnel是派生类。

2个问题:

  1. 参数列表中没有名称的参数是什么意思?即。指向Particles对象的指针,Particles*。或者没有名称的无符号int。它们为什么会这样出现,它们的意思是什么?
  2. 带有名称的参数(因此是通常的参数)被设置为()内部的值是什么意思?即。int ipart_ref=0。这是否意味着,当我们调用IonizationTunnelObject.Operator()(arguments)时,我们必须指定3个参数而不是4个参数,最后一个参数(ipart_ref)被静默地推断为0,即使没有写入我们指定的3个参数中?或者我们可以使用4个参数调用IonizationTunnelObject.Operator()(参数)并将ipart_ref设置为我们想要的任何整数值吗?

我见惯了foo(int x){code},从来没有见过foo(int){code}。

非常感谢!


共1个答案

匿名用户

一个不一定需要名称的未使用参数有时对于让重载解析选择所需的重载很有用:

void foo(int) {
    std::cout << "this is foo(int)\n";
    std::cout << "I dont need a name for the argument, because I am not using it anyhow";
}
void foo(double) {
    std::cout << "this is foo(double)";
}

foo(1);   // calls foo(int)
foo(1.0); // calls foo(double)

但是,您看到的可能只是声明中省略的名称,而在定义中它们将被命名,如:

void foo(int);          // forward declaration
void bar(int x) {
    if (x==42) foo(x);  // needs a declaration of foo
}
void foo(int x) {       // definition
    if (x!=42) bar(x);
}

=something是默认参数。一个函数

void foo(int x = 0) {
    std::cout << x;
}

可以这样调用:

foo(42);

或者像这样:

foo();

在这种情况下,它相当于调用

foo(0);

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(重写|函数|中|参数|调用|operator|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?