ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 5) онлайн
Переменное число аргументов функции
Вспомним функцию starline() из программы TABLE и функцию repchar() из про- граммы TABLEARG, которые мы создали в начале этой главы. Функция starline() выводила на экран линию из 45 символов *, а функция repchar() выводила задан- ный символ заданное число раз, используя два аргумента. Мы можем создать третью функцию, charline(), которая всегда печатает 45 символов, но позволяет задавать печатаемый символ. Все три функции, starline(), repchar() и charline(), выполняют схожие действия, но их имена различны. Для программиста это озна- чает, что нужно запомнить эти имена и различия между действиями функций. Очевидно, что было бы гораздо удобнее использовать одно и то же имя для всех трех функций, несмотря на то, что они используют различные наборы аргумен- тов. Программа OVERLOAD демонстрирует, каким образом это можно осуществить:
// overload.cpp // перегрузка функций #include <iostream> using namespace std;
void repchar(); // прототипы
void repchar(char); void repchar(char, int);
int main() {
repchar(); repchar('='); repchar('+', 30); return 0;
}
//---функция repchar()-----------------------------
// выводит на экран 45 символов '*'
void repchar() {
for(int j=0; j<45; j++) // цикл, выполняющийся 45 раз cout << '*'; // вывод символа '*'
cout << endl;
}
//--- функция repchar()----------------------------- // выводит 45 заданных символов
void repchar(char ch) {
for(int j=0; j<45; j++) // цикл, выполняющийся 45 раз cout << ch; // вывод заданного символа
cout << endl;
}
Первые две из линий имеют длину 45 символов, третья — 30 символов.
В программе содержатся три функции с одинаковым именем. Каждой из функций соответствует свое объявление, определение и вызов. Каким же обра- зом компилятор различает между собой эти три функции? Здесь на помощь приходит сигнатура функции, которая позволяет различать между собой функ- ции по количеству аргументов и их типам. Другими словами, объявление void repchar();
не содержащее аргументов, и объявление void repchar(char, int); задают разные функции.
//--------------------------------------------------------
// функция repchar()
// выводит заданный символ заданное число раз
void repchar(char ch, int n) {
for(int j=0;j<n; j ++) // цикл, выполняющийся n раз cout << ch; // вывод заданного символа
cout << endl;
}
Эта программа выводит на экран три различных вида линий: *********************************************
=================================
++++++++++++++++++++++++++++++

Рис. 5.8. Перегруженные функции
Разумеется, компилятор, обнаружив несколько функций с одинаковыми имена- ми, но разными аргументами, мог бы расценить это как ошибку программиста. Именно таким образом поступил бы компилятор языка C. Но компилятор C++
без излишних вопросов обработает функции для каждого из таких определений. Какая из функций будет выполнена при вызове, зависит от количества аргумен- тов, указанных в вызове. Рисунок 5.8 иллюстрирует данный механизм.
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
