С++. Перегруженные функции и аргументы по умолчанию

В программе может потребоваться выполнить одни и теже действия (функцию), однако входные данные при этом могут быть разными. На помощь приходят два механизма:

  • перегрузка функции,
  • передача значений параметрам в прототипе функции (аргументы по умолчанию).

В каких случаях следует использовать первый, а в каких второй?

Перегрузка функций заключается в том, что в программе существуют несколько одноименных функций, которые различаются между собой количеством параметров и|или их типом. То, какая функция вызывается, определяется по переданным аргументам. Перегрузка функций - более гибкая и универсальная идея.

При задании аргументов по умолчанию не приходится дублировать код (есть всего одна функция). Однако при этом нельзя передавать аргументы разного типа, использовать значение по умолчанию первого аргумента (стоящих впереди) и передать для второго (стоящих после).

Понятно, что перегрузку функций и установку аргументов по умолчанию можно использовать совместно.

Ниже приведены примеры, взятые их книги Р.Лафоре "Объектно-ориентированное программирование в C++".

Перегруженная функция (переменное число аргументов)

#include <iostream>
using namespace std;
 
void repchar();
void repchar(char);
void repchar(char, int);
 
int main() {
    repchar();
    repchar('=');
    repchar('+',30);
    return 0;
}
 
void repchar() {
    for (int j=0; j<45; j++)
        cout << '*';
    cout << endl;
}
 
void repchar(char ch) {
    for (int j=0; j<45; j++)
        cout << ch;
    cout << endl;
}
 
void repchar(char ch, int n) {
    for (int j=0; j<n; j++)
        cout << ch;
    cout << endl;
}

Вывод:

*********************************************
=============================================
++++++++++++++++++++++++++++++

Перегруженная функция (различные типы аргументов)

#include <iostream>
using namespace std;
 
struct Distance {
    int feet;
    float inches;
};
 
void engldisp(Distance);
void engldisp(float);
 
int main() {
    Distance d1;
    float d2;
    cout << "Введите число футов: ";
    cin >> d1.feet;
    cout << "Введите число дюймов: ";
    cin >> d1.inches;
    cout << "Введите длину в дюймах: ";
    cin >> d2;
    cout << "d1 = ";
    engldisp(d1);
    cout << "\nd2 = ";
    engldisp(d2);
    cout << endl;
    return 0;
}
 
void engldisp(Distance dd) {
    cout << dd.feet << "\'-" << dd.inches << "\"";
}
 
void engldisp(float dd) {
    int feet = static_cast<int>(dd/12);
    float inches = dd - feet * 12;
    cout << feet << "\'-" << inches << "\"";
}
Введите число футов: 45
Введите число дюймов: 32
Введите длину в дюймах: 123
d1 = 45'-32"
d2 = 10'-3"

Установка аргументов по умолчанию

#include <iostream>
using namespace std;
 
void repchar(char='*', int=45);
 
int main() {
    repchar();
    repchar('=');
    repchar('+',30);
    return 0;
}
 
void repchar(char ch, int n) {
    for (int j=0; j<n; j++)
        cout << ch;
    cout << endl;
}

Вывод:

*********************************************
=============================================
++++++++++++++++++++++++++++++

Создано