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

params in overriden function-call operator() c++

我在 IonizationTunnel.h 文件中发现了这个被覆盖的函数调用 operator():

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

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

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

电离是基础class。 IonizationTunnel 是 Derived class.

2 个问题:

  1. 参数列表中没有名称的参数是什么意思? IE。指向粒子对象的指针,粒子*。或者 unsigned int 没有名字。为什么它们看起来像那样,它们是什么意思?
  2. 在 () 中设置一个值的带有名称的参数(通常的参数)是什么意思? IE。 int ipart_ref = 0。这是否意味着当我们调用 IonizationTunnelObject.operator()(arguments) 时,我们必须指定 3 个参数而不是 4 个,最后一个参数 (ipart_ref) 被默默地推断为 0,即使没有写入我们指定的 3 个参数?或者我们可以使用 4 个参数调用 IonizationTunnelObject.operator()(arguments) 并将 ipart_ref 设置为我们想要的任何整数值吗?

我看惯了 foo(int x) {code} 而从未见过 foo(int) {code}。

非常感谢!

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

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