Значения по умолчанию в 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
.