Перегрузка имени функции

Обычно имеет смысл давать различным функциям различные имена. Если же несколько функций делает одно и то же действие над объектами различных типов, то удобнее дать однообразные имена всем этим функциям. Перегрузкой имени именуется его внедрение для обозначения различных операций над различными типами. Фактически уже для главных операций С++ применяется перегрузка. Вправду Перегрузка имени функции: для операций сложения есть только одно имя +, но оно употребляется для сложения и целых чисел, и чисел с плавающей точкой, и указателей. Таковой подход просто можно распространить на операции, определенные юзером, т.е. на функции. К примеру: void print(int); // печать целого void print(const char*) // печать строчки знаков Для Перегрузка имени функции транслятора в таких перегруженных функциях общее только одно - имя. Разумеется, по смыслу такие функции сходны, но язык не содействует и не препятствует выделению перегруженных функций. Таким макаром, определение перегруженных функций служит, сначала, для удобства записи. Но для функций с такими классическими именами, как sqrt, print либо Перегрузка имени функции open, нельзя этим удобством третировать. Если само имя играет важную семантическую роль, к примеру, в таких операциях, как + , * и << ($$7.2), либо для конструктора класса ($$5.2.4 и $$7.3.1), то такое удобство становится значимым фактором. При вызове функции с именованием f транслятор должен разобраться, какую конкретно функцию f следует вызывать. Для этого сравниваются типы фактических характеристик Перегрузка имени функции, обозначенные в вызове, с типами формальных характеристик всех описаний функций с именованием f. В итоге вызывается та функция, у которой формальные характеристики лучшим образом сопоставились с параметрами вызова, либо выдается ошибка если таковой функции не нашлось. К примеру: void print(double); void print(long); void f() { print(1L); // print(long Перегрузка имени функции) print(1.0); // print(double) print(1); // ошибка, неоднозначность: что вызывать // print(long(1)) либо print(double(1)) ? } Тщательно правила сравнения характеристик описаны в $$R.13.2. Тут довольно привести их сущность. Правила используются в последующем порядке по убыванию их приоритета: [1] Четкое сравнение: сравнение вышло без всяких преобразований типа либо только с неминуемыми преобразованиями (к Перегрузка имени функции примеру, имени массива в указатель, имени функции в указатель на функцию и типа T в const T). [2] Сравнение с внедрением стандартных целочисленных преобразований, определенных в $$R.4.1 (т.е. char в int, short в int и их беззнаковых двойников в int), также преобразований float в double. [3] Сравнение с Перегрузка имени функции внедрением стандартных преобразований, определенных в $$R.4 (к примеру, int в double, derived* в base*, unsigned в int). [4] Сравнение с внедрением пользовательских преобразований ($$R.12.3). [5] Сравнение с внедрением эллипсиса ... в описании функции. Если найдены два сравнения по самому приоритетному правилу, то вызов считается разноплановым, а означает неверным. Эти правила сравнения характеристик работают с учетом Перегрузка имени функции правил преобразований числовых типов для С и С++. Пусть имеются такие описания функции print: void print(int); void print(const char*); void print(double); void print(long); void print(char); Тогда результаты последующих вызовов print() будут такими: void h(char c, int i, short s, float f) { print(c Перегрузка имени функции); // четкое сравнение: вызывается print(char) print(i); // четкое сравнение: вызывается print(int) print(s); // стандартное целочисленное преобразование: // вызывается print(int) print(f); // стандартное преобразование: // вызывается print(double) print('a'); // четкое сравнение: вызывается print(char) print(49); // четкое сравнение: вызывается print(int) print(0); // четкое сравнение: вызывается print(int) print("a"); // четкое Перегрузка имени функции сравнение: // вызывается print(const char*) } Воззвание print(0) приводит к вызову print(int), ведь 0 имеет тип int. Воззвание print('a') приводит к вызову print(char), т.к. 'a' - типа char ($$R.2.5.2). Отметим, что на разрешение неопределенности при перегрузке не оказывает влияние порядок описаний рассматриваемых функций, а типы возвращаемых функциями Перегрузка имени функции значений вообщем не учитываются. Исходя из этих правил можно гарантировать, что если эффективность либо точность вычислений существенно различаются для рассматриваемых типов, то вызывается функция, реализующая самый обычной метод. К примеру: int pow(int, int); double pow(double, double); // из complex pow(double, complex); // из complex pow(complex, int); complex Перегрузка имени функции pow(complex, double); complex pow(complex, complex); void k(complex z) { int i = pow(2,2); // вызывается pow(int,int) double d = pow(2.0,2); // вызывается pow(double,double) complex z2 = pow(2,z); // вызывается pow(double,complex) complex z3 = pow(z,2); // вызывается pow(complex,int) complex z4 = pow(z,z); // вызывается pow Перегрузка имени функции(complex,complex) }
peregovori-kak-kommunikativno-mislitelnoe-prostranstvo-konflikta.html
peregovori-o-rashozhdenii-s-drugim-sudnom.html
peregovori-posle-stolknoveniya.html