674 ______ __ __________________Часть IV. Новые возможности C++

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

Конфликт конфликту рознь

До сих пор конфликт имен рассматривался как самая большая неприятность, которая может случиться с программой. С одной стороны, в этом есть известная доля истины, но с другой — существует множество случаев, когда совпадение имен не только корректно, но и весьма полезно. Опытные программисты C++ здесь сразу укажут такое- полезное исключение — это перегрузка (overloading).

В C++ функция или метод может иметь более чем одно определение, если аргументы каждой из версий различны. Пример из листинга *24.3 демонстрирует возможность определения двух форм функций Add(), одновременно существующих в одной программе.

#include <iostream.h> ft include <cstring.h>

long Add(const long addendl, const long addend2) {

return addendl + addend2;

}

string Add(const strings strl, const strings str2) {

return strl + str2;

void main() {

cout « "-11 + 67 = " « Add(-ll, 67) « "\n";

cout « "\"Сложение \" + \"строк\" = \""

« Add("Сложение ", "строк") « "\"\n";

}

О функции Add () из листинга 24.3 говорят, что она перегружена. Это означает, что несмотря на двойное определение функции Add (), программа компилируется без ошибок, и в зависимости от того, как функция вызывается, т. е. какие аргументы в нее передаются, компилятор определяет, какую функцию использовать.