Глава 15. Перегрузка функций 375

со значением о. Так вот это вам не удастся: никогда для аргумента со значением о не будет вызвана версия Foo, принимающая char*.

Функции, отличающиеся только операцией получения адреса, тоже не могут быть перегружены. Например функции

int Foo ( int &r) ;

int Foo ( int r) ;

недостаточно различны для перегрузки.

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

class X

{

public:

static void F (); // ошибка: не перегружаема void F (); // ошибка: не перегружаема ,

};

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

void Lulu (); /'/ ошибка: перегрузка не производится int Lulu(); // по возвращаемому типу

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

Далее ...

Перегрузка функций — это практичное решение реальных проблем. Компоновщик, разрешая вызовы функций, ищет имена в таблице символов; чтобы при этом не возникало конфликта имен, имена должны быть уникальными. Это в C++ осталось неизменным. Технический прием, позволяющий компилятору создавать уникальные имена на основе имени функции и типов ее аргументов, называется уточнением имен (name mangling).

Уточнение имен путем использования первых букв названия типа гарантирует, что имена будут уникальны и вызовы функций разрешимы. Перегрузка функций — это изыск, но это и необходимость. Без перегрузки функций были бы немыслимы множественные конструкторы и оператор-функции.

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