|
Перегрузка В 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(); // Вызывается константная версия |
Copyright 2005. Климов Александр. All Right Reserved.