重写函数调用 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 个问题:
- 参数列表中没有名称的参数是什么意思? IE。指向粒子对象的指针,粒子*。或者 unsigned int 没有名字。为什么它们看起来像那样,它们是什么意思?
- 在 () 中设置一个值的带有名称的参数(通常的参数)是什么意思?
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);
我在 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 个问题:
- 参数列表中没有名称的参数是什么意思? IE。指向粒子对象的指针,粒子*。或者 unsigned int 没有名字。为什么它们看起来像那样,它们是什么意思?
- 在 () 中设置一个值的带有名称的参数(通常的参数)是什么意思? 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);