C ++ ...当所有参数都有默认值时

时间:2010-01-16 06:24:02

标签: c++ function arguments default

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

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

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

3 个答案:

答案 0 :(得分:13)

如果函数定义在头文件中,则可以正常工作。规则是任何调用函数的人都必须“看到”默认值。

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

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

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

答案 1 :(得分:2)

这将有效:

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

void m::f(int ***a)
{
}

答案 2 :(得分:2)

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