【问题标题】:params in overriden function-call operator() c++重写函数调用运算符()中的参数 c++
【发布时间】:2020-12-02 15:06:20
【问题描述】:

我在 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) {}

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

2 个问题:

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

我习惯于看到 foo(int x) {code},而我从未见过 foo(int) {code}。

非常感谢!

【问题讨论】:

  • 在函数的声明中,变量的名称被忽略,只是为了便于阅读。除了简单的习惯之外,将其保留的常见原因如下:如果您有不使用其中一个参数的重载函数,您也可以在实现中保留名称,以便让用户清楚未使用该变量。此外,这避免了编译器关于未使用变量的警告。
  • 非常感谢!

标签: c++ oop arguments virtual-functions


【解决方案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);

【讨论】:

  • 小澄清:@largest_prime_is_463035 的意思是重载是拥有不需要的输入变量的原因。有没有名字并不会改变重载本身。
  • 非常感谢你们两位!非常感谢!
猜你喜欢
  • 2011-01-27
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
  • 1970-01-01
  • 2011-02-23
  • 2012-04-23
  • 2016-11-21
  • 2011-06-09
相关资源
最近更新 更多