Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ответы.docx
Скачиваний:
335
Добавлен:
22.03.2016
Размер:
1.03 Mб
Скачать

80. Inline функции

Использование функций снижает быстродействие программы. Это объясняется затратами времени на вызов функций (работа со стеком программы). Если в программе используется большое количество вызовов небольших функций, то быстродействие программы может существенно снизиться.

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

inline int ReadInt(char *S) // Ввод целых значений по текстовому запросу S

{

cout << S;

int I;

cin >> I;

return I;

}

{

……..

int Vozrast = ReadInt (“Сколько Вам лет? ”);

……..

int Kurs = ReadInt (“На каком курсе Вы учитесь? ”);

……..

int Ocenka = ReadInt (“Сколько у Вас отличных оценок в последней сессии? ”);

……..

}

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

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

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

• рекурсии;

• циклов, переключателей, инструкций goto;

• статических (static) переменных.

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

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

Поскольку при вызове функций типы данных подставляемых аргументов и их количество должны соответствовать типам данных и количеству параметров функций, в языке C приходилось использовать множество функций с различными именами для выполнения одних и тех же действий над различными типами данных. Например, для вычисления абсолютного значения некоторого числа в библиотеках языка C имелось несколько различных функций: abs, labs, fabs, fadsf. Использование этих функций определялось типами данных обрабатываемых чисел. Но все они выполняли одно и то же действие – вычисляли абсолютное значение аргумента. Это доставляло определенные неудобства.

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

Перегруженными функциями называются функции, имеющие одинаковые имена, но различающиеся количеством, типами данных или порядком следования разнотипных параметров. Например:

void f (char c)

{

…….

}

void f (int c)

{

…….

}

int f (char c, int i)

{

…….

}

void f (int c, char i)

{

…….

}

void f (char c, char i)

{

…….

}

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

Нельзя перегружать функции, различающиеся только типами данных возвращаемых значений. Например, компилятор “не разрешит” перегрузить следующую функцию:

int f (char c, char i)

{

…….

}

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

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