Параметры по умолчанию могут оказаться полезными, если собираешься добавить функциональность в какую-либо функцию и при этом не хочешь ее перегружать.
Например, у меня в программе использовался объект для вывода сообщений в лог. После того, как с программой поработали какое-то время, оказалось, что неплохо было бы управлять содержимым лога: писать туда только ошибки, информационные сообщения или полную трассировку программы для отладки.
Первоначальный вариант метода:
void WriteLine(const CString& msg);
После расширения:
enum ELogLevel
{
ELL_Detail,
ELL_Info,
ELL_Warning,
ELL_Error
};
...
void WriteLine(const CString& msg, enum ELogLevel logLvl = ELL_Info);
Теперь можно задать для каждого сообщения его уровень и выводить только сообщения, уровень которых не ниже заданного оператором. При этом весь старый код продолжает работать, все выдаваемые им сообщения считаются информационными. Если бы не было возможности задать значение параметра
logLvl по умолчанию, пришлось бы либо создавать перегруженный метод
WriteLine с двумя параметрами, либо вылавливать по всей программе его вызовы и добавлять второй параметр.