Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Итог_Пособие C++.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.03 Mб
Скачать

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

Согласно правилам языка С++, в одной программе (и в одной области видимости) можно разместить несколько функций, которые имеют одинаковые имя и тип возвращаемого результата, но различаются списком формальных параметров. Такие функции называются перегруженными. Список параметров перегруженных функций может различаться количеством и типами параметров, при этом наличие спецификатора const принимается во внимание только для параметров, которые являются указателями или ссылками и тоже является отличием.

Когда в программе встречается обращение к перегруженной функции, компилятор анализирует список фактических параметров, которые передаются функции, и подбирает ту из перегруженных функций, которая наилучшим образом соответствует этим параметрам – при этом принимаются во внимание все допустимые возможности преобразования типов. То есть, может получиться и так, что несколько перегруженных функций вполне соответствуют одному обращению к функции, в таком случае, из них выбирается наилучшая, с точки зрения компилятора. Если ни одна из перегруженных функций не соответствует тем параметрам, которые имеются в вызове функции, компилятор выдаёт сообщение об ошибке.

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

В примере приведены две перегруженные функции нахождения максимального из чисел – для двух переменных и для вектора. Чтобы продемонстрировать ещё одну возможность стандартной библиотеки С++, для поиска максимального элемента вектора используется стандартная функция max_element.

// Пример 1.21 - перегрузка функции нахождения максимального числа

#include <iostream>

#include <vector>

#include <algorithm> //функция max_element

using namespace std;

int max(int a, int b) { // максимальное из двух чисел

return a>b?a:b;

}

int max(const vector<int> &x) {// максимальное в векторе

vector<int>::const_iterator max_x = max_element(x.begin(), x.end());

return *max_x;

}

int main() {// обращение к перегруженным функциям

int mas[4] = {1, 3, 7, 4};

// вектор заполняется элементами массива mas

vector<int> v(mas, mas+4);

// выводим максимальный элемент вектора

cout << max(v) << endl;

int a(3),b(5);

// выводим максимальное из двух чисел

cout<<max(a,b)<<endl;

system("pause"); return 0;

}

1.12.4 Встроенные (inline) функции

Основная цель использования inline функций – ускорить выполнение программы за счёт увеличения размеров её исполняемого кода. Если в прототипе функции присутствует ключевое слово inline, то компилятор обрабатывает обращение к такой функции иначе, чем обычно.

При обычном способе компилятор для каждого обращения к функции помещает в объектный код инструкцию этой вызова функции. При этом код функции размещается отдельно, причём в единственном экземпляре, сколько бы раз не вызывалась функция в программе. Если функция определена во внешнем файле или это функция из стандартной библиотеки, то её тело помещается в исполняемый код на этапе компоновки.

Для inline функций компилятор заменяет каждое обращение к функции на код этой функции, т.е. код такой функции повторяется в исполняемом коде столько раз, сколько было обращений к этой функции.

А где тут ускорение? Всё дело в том, что на каждый вызов функции тратится дополнительное (хотя и небольшое) время. Таким образом, монолитная программа без функций выполняется быстрее, чем программа с вызовом функций. Ключевое слово inline, в итоге, позволяет превратить программу, имеющую модульный исходный код, в монолитный исполняемый код (с большим количеством повторяющихся фрагментов).

Разумеется, не следует употреблять inline применительно к большим функциям, которые вызываются очень много раз, – размер исполняемого файла может стать запредельным. В этом случае компилятор может даже проигнорировать слово inline. Но всё-таки, примите к сведению и такую возможность.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]