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 (), программа компилируется без ошибок, и в зависимости от того, как функция вызывается, т. е. какие аргументы в нее передаются, компилятор определяет, какую функцию использовать.