Что значит: “virtual void funcC( double = 0.0 );”?

383
14 февраля 2017, 19:29

Добрый день. Случайно наткнулся на функцию у которой непонятно что записано в параметрах:

virtual void funcC( double = 0.0 )

Если бы было имя переменной, то было бы понятно что это за параметр или если бы эта штука не компилировалась бы, то это была бы опечатка) Так нет же, все компилируется и работает. Что вот это такое, в чем его смысл: double = 0.0 ?

Answer 1

Значение по умолчанию.

Если вы вызовите ее как Obj.funcC() - это будет воспринято как Obj.funcC(0.0).

Словом, читайте, что такое значения аргументов функций по умолчанию - например, тут.

Имени переменной нет - потому что она может быть просто зарезервирована или не нужна. Например, в наследнике она может понадобиться. А в базовом классе она не нужна.

struct Base
{
    virtual void out(double = 0.0)
    {
        cout << "Base::out\n";
    }
};
struct Derived: public Base
{
    virtual void out(double x)
    {
        cout << "Drived::out " << x << "\n";
    }
};

int main(int argc, const char * argv[])
{
    Base * b = new Derived;
    b->out();   // Тут вызовется out() из Derived со значением 0.0
    b->out(3);  // Тут - со значением 3.0
}

Имени аргумента в Base не нужно - он не используется, и нужен только для обеспечения сигнатуры.

Если ввести какое-то имя - компилятор справедливо заметит, что имя есть, но не используется. Тут - он промолчит.

READ ALSO
Неразрешенные внешний символы (ImGui)

Неразрешенные внешний символы (ImGui)

Добрый деньПытаюсь внедрить ImGui в свое приложение

407
wcout в WinXP при использовании MinGW w64

wcout в WinXP при использовании MinGW w64

Как вывести не-ASCII текст с помощью std::wcout в Windows XP, если для компиляции используется MinGW w64? Уже посмотрел кучу похожих вопросов, но ничего из этого...

301
Переставить слои местами

Переставить слои местами

Какие возможности есть по следующему заданию???

317
Как сравнить char и string c++?

Как сравнить char и string c++?

Имеется такой код:

444