【问题标题】:C++ ...when all the arguments have default valuesC++ ...当所有参数都有默认值时
【发布时间】:2010-01-16 06:24:02
【问题描述】:

我猜这是一个非常荒谬/基本的问题,但仍然:

class m
{
public:
   void f(int ***);
  /***/
}
void m::f(int ***a = NULL)
{
  /***/
}

对 f 的调用(以及任何对 所有 参数具有默认值的函数)不接受 0 参数。为什么?那我应该如何格式化声明呢?

【问题讨论】:

    标签: c++ function arguments default


    【解决方案1】:

    如果函数定义在头文件中,那就可以了。规则是调用函数的人必须“看到”默认值。

    所以,我猜你在单独的源文件中有函数定义。假设是这样,只需将默认值放在函数声明中(在类中):

    class m
    {
    public:
       void f(int *** = 0);
      /***/
    };
    

    您还需要从函数定义中删除默认值,因为您只能在一个位置定义默认值(即使值本身相同)。

    【讨论】:

    • 哦,是的。相同的文件,但调用在定义之前。很容易猜到为什么!尽管我有一种虚构的看法(当然是基于随机性),但问题与所有参数都具有默认值的函数有关。干杯!
    【解决方案2】:

    这将起作用:

    class m
    {
    public:
       void f(int ***a = NULL);
    };
    
    void m::f(int ***a)
    {
    }
    

    【讨论】:

      【解决方案3】:

      C++ 中的默认值是语法糖;编译器实质上会在调用点为您插入参数。这意味着编译器需要知道默认值是什么,所以它必须由函数声明提供。

      这也意味着如果你有继承和虚方法,使用的默认值来自静态类型(即编译器认为对象是什么类型),而不是运行时类型。例如:

      class Base
      {
      public:
          virtual ~Base() { }
      
          virtual std::string foo(std::string s = "b") { return "Base:" + s; }
      };
      
      class Derived
      : public Base
      {
      public:
         virtual std::string foo(std::string s = "d") { return "Derived:" + s; }
      };
      
      int main(void)
      {
         Derived d;
         Base& b = d;
         std::cout << b.foo() << std::endl;
         return 0;
      }
      

      将打印Derived:b,而不是Derived:d

      【讨论】:

        猜你喜欢
        • 2011-03-18
        • 1970-01-01
        • 2017-12-16
        • 1970-01-01
        • 2017-02-20
        • 2017-08-06
        • 2015-03-31
        • 2012-05-04
        • 1970-01-01
        相关资源
        最近更新 更多