Главная->Інформатика та програмування->Содержание->Переменное число аргументов функции

ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В 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 иллюстрирует данный механизм.

 

24