Материалы книги получены с http://www.itlibitum.ru/
Перегрузка
В C++ существует несколько способов многократного использования имен функций. В частности, пространства имен функций формируются на основе классов. Одноименные функции в классах, не связанных друг с другом, выполняют совершенно разные задачи. Перегрузка функций развивает великую традицию разделения пространств имен функций и позволяет многократно использовать имена функций в границах одной области действия.
Аргументы
Две функции с одинаковыми именами считаются разными, если они отличаются по количеству, порядку или типу аргументов.
void Fn();
29
void Fn(int);
void Fn(long); // Можно, если типы long и int отличаются размером
int Fn(int); // Нельзя - отличается только тип возвращаемого значения
int Fn(char*); // Можно, отличаются аргументы
void Fn(int, char*);
void Fn(char*, int); // Можно, аргументы следуют в другом порядке
void Fn(char* s, int x, int y = 17); // Можно - три аргумента вместо двух
Fn("hello", 17); // Ошибка - совпадают две сигнатуры
Пока аргументы отличаются, компилятор не жалуется на изменение возвращаемого типа.
Инициализация по умолчанию (такая как у=17) может присутствовать при объявлении функции, хотя позднее она может стать причиной неоднозначности при вызове функции (как в последней строке примера).
Константные функции
Константная функция, аргументы которой совпадают с аргументами неконстантной функции, тем не менее считается другой функцией. Компилятор вызывает константную или неконстантную версию в зависимости от типа переменной, указывающей или ссылающейся на объект.
class Foo {
public:
void Fn();
void Fn() const; // Другая функция!
};
Foo* f = new Foo;
f->Fn(); // Вызывается неконстантная версия
const Foo* f1 = f;
f1->Fn(); // Вызывается константная версия
Назад Содержание Далее
|