2016-01-12 5 views
1

В C++ неудобно иметь неопределенную переменную как аргумент функции, который имеет значение аргумента по умолчанию?Является ли неопределенная переменная в аргументе по умолчанию плохим?

Я считаю, что это приведет к непредсказуемому поведению, но я видел его в каком-то ранее существовавшем коде, и я не вижу никаких предупреждений быть выводимыми и хотел, чтобы подтвердить поведение следует ожидать

заголовка файла - заголовок .h

#ifndef HEADER_H 
#define HEADER_H 

class aClass 
{ 
    int someFunctionA(int aValue = 0); 
    virtual int someFunctionB(int aValue = 0); 
} 

#endif 

CPP Файл - body.cpp

int aClass::someFunctionA(int aValue) 
{ 
    if (aValue == 0) 
    { 
     return 0; 
    } 
    else 
    { 
     return 1; 
    } 
} 

int aClass::someFunctionB(int aValue) 
{ 
    if (aValue == 0) 
    { 
     return 0; 
    } 
    else 
    { 
     return 1; 
    } 
} 

int main(int argc, char **argv, char **envp) 
{ 
    int uninitializedInt; 
    int initializedInt = 1; 

    aClass example = new aClass(); 

    aClass.someFunctionA(); // Expecting this to return 0 
    aClass.someFunctionB(); // Expecting this to return 0 

    aClass.someFunctionA(uninitializedInt); // Expecting this to be undefined behaviour 
    aClass.someFunctionB(uninitializedInt); // Expecting this to be undefined behaviour 

    aClass.someFunctionA(initializedInt); // Expecting this to return 1 
    aClass.someFunctionB(initializedInt); // Expecting this to return 1 
} 

ли мои ожидания как в моих комментариях к коду правильно?

+1

'Мои ожидания по моим кодовым комментариям верны?' Да (я думаю?). Почему они должны ошибаться? ... Предупреждения могут не работать, поэтому компьютеры не программируются. – deviantfan

+0

@deviantfan У меня не было предупреждения, и я подумал, что это может быть какое-то поведение, о котором я не знал. Например, если вы передаете неинициализированную переменную, она автоматически установит значение по умолчанию – Puddler

+0

. Ваш примерный код безнадежно сломан. Я ожидаю, что компилятор предупредит об использовании неинициализированной переменной, если вы установите уровни предупреждений достаточно высокими. – Praetorian

ответ

3

Мои ожидания по моим кодовым комментариям верны?

Да.
Предупреждения не гарантируются, чтобы быть всегда правильными, т.е. неправильные предупреждения и отсутствующие предупреждения возможны, по сути, из-за проблемы с остановкой (по крайней мере, для некоторых предупреждений. И да, этот случай не так уж и трудный, но все же ...).