C++ 重写函数调用运算符()c++;

C++ 重写函数调用运算符()c++;,c++,oop,arguments,virtual-functions,C++,Oop,Arguments,Virtual Functions,我在IoniationTunnel.h文件中遇到了这个被重写的函数调用运算符(): void operator()(Particles *, std::vector<double>*, unsigned int, int ipart_ref = 0) override; void操作符(); 这与电离.h文件中的虚拟void操作符()的参数完全匹配: virtual void operator()(Particles *, std::vector<double>*,

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

void operator()(Particles *, std::vector<double>*, unsigned int,  int ipart_ref = 0) override;
void操作符();
这与电离.h文件中的虚拟void操作符()的参数完全匹配:

virtual void operator()(Particles *, std::vector<double>*, unsigned int,  int ipart_ref = 0) {}
virtualvoid操作符()(粒子*,标准::向量*,无符号int,int-ipart\u-ref=0){}
电离是基类。电离隧道是派生类

2个问题:

  • 参数列表中没有名称的参数意味着什么?即指向粒子对象的指针,粒子*。或不带名称的无符号整数。为什么他们看起来像那样?他们是什么意思
  • 将名称(通常是参数)设置为()中的值的参数意味着什么? 即内部ipart\u ref=0。这是否意味着当我们调用IoniationTunneLobject.operator()时(参数),我们必须指定3个参数而不是4个,最后一个参数(ipart_ref)被静默地推断为0,即使没有写入我们指定的3个参数中?或者我们可以使用4个参数调用IoniationTunneLobject.operator()(参数),并将ipart_ref设置为我们想要的任何整数值吗
  • 我习惯于看到foo(intx){code},我从来没有见过foo(intx){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)
    
    =something
    是默认参数。函数

    void foo(int x = 0) {
        std::cout << x;
    }
    
    或者像这样:

    foo(42);
    
    foo();
    
    在这种情况下,它相当于调用

    foo(0);
    

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

    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)
    
    =something
    是默认参数。函数

    void foo(int x = 0) {
        std::cout << x;
    }
    
    或者像这样:

    foo(42);
    
    foo();
    
    在这种情况下,它相当于调用

    foo(0);
    

    在函数声明中,忽略变量的名称,只是为了可读性。除了一个简单的习惯外,放弃它的一个常见原因是:如果您的重载函数不使用其中一个参数,那么您也可以在实现中放弃该名称,以便向用户清楚地表明没有使用该变量。此外,这避免了编译器关于未使用变量的警告。非常感谢!在函数声明中,忽略变量的名称,只是为了可读性。除了一个简单的习惯外,放弃它的一个常见原因是:如果您的重载函数不使用其中一个参数,那么您也可以在实现中放弃该名称,以便向用户清楚地表明没有使用该变量。此外,这避免了编译器关于未使用变量的警告。非常感谢!小说明:@maximust_prime_is_463035的意思是,重载是使用不需要的输入变量的原因。不管有没有名字,重载本身都不会改变任何东西。@Cedric谢谢,重新措辞谢谢你们两个!非常感谢!小说明:@maximust_prime_is_463035的意思是,重载是使用不需要的输入变量的原因。不管有没有名字,重载本身都不会改变任何东西。@Cedric谢谢,重新措辞谢谢你们两个!非常感谢!