Понятие, описание и определение inline функции
inline-функция — это такая функция, чье тело подставляется в каждую точку вызова, вместо того, чтобы генерировать код вызова.
Если компилятор C++ перед определением функции встречает ключевое слово inline, он будет заменять обращения к этой функции (вызовы) на последовательность операторов, эквивалентную выполнению функции. Таким образом ваши программы улучшают производительность, избавляясь от издержек на вызов функции и в то же время выигрывая в стиле программы, благодаря использованию функций
При объявлении функции внутри программы C++ позволяет вам предварить имя функции ключевым словом inline. Если компилятор C++ встречает ключевое слово inline, он помещает в выполнимый файл (машинный язык) операторы этой функции в месте каждого ее вызова. Таким образом, можно улучшить читаемость ваших программ на C++, используя функции, и в то же время увеличить производительность, избегая издержек на вызов функций. Следующая программа INLINE.CPP определяет функции тах и min как inline:
#include <iostream.h>
inlineint max(int a, int b)
{
if (a > b) return(a);
else return(b) ;
}
inlineint min(int a, int b)
{
if (a < b) return(a);
else return(b);
}
void main(void)
{
cout<< "Минимум из 1001 и 2002 равен " <<min(1001, 2002) <<endl;
cout<< "Максимум из 1001 и 2002 равен " <<max(1001, 2002) <<endl;
}
В данном случае компилятор C++ заменит каждый вызов функции на соответствующие операторы функции. Производительность программы увеличивается без ее усложнения.
Механизм перегрузки функций
Под перегрузкой функции понимается, определение нескольких функций (две или больше) с одинаковым именем, но различными параметрами. Наборы параметров перегруженных функций могут отличаться порядком следования, количеством, типом. Таким образом перегрузка функций нужна для того, чтобы избежать дублирования имён функций, выполняющих сходные действия, но с различной программной логикой. Например, рассмотрим функцию areaRectangle(), которая вычисляет площадь прямоугольника.
floatareaRectangle(float, float) //функция, вычисляющая площадь прямоугольника с двумя параметрами a(см) и b(см)
{
return a * b; // умножаем длинны сторон прямоугольника и возвращаем полученное произведение
}
Итак, это функция с двумя параметрами типа float, причём аргументы передаваемые в функцию должны быть в сантиметрах, возвращаемое значение типа float - тоже в сантиметрах.
Предположим, что наши исходные данные (стороны прямоугольника) заданы в метрах и сантиметрах, например такие: a = 2м 35 см; b = 1м 86 см. В таком случае, удобно было бы использовать функцию с четырьмя параметрами. То есть, каждая длинна сторон прямоугольника передаётся в функцию по двум параметрам: метры и сантиметры.
floatareaRectangle(floata_m, floata_sm, floatb_m, floatb_sm) // функция, вычисляющая площадь прямоугольника с 4-мя параметрами a(м) a(см); b(м) b(cм)
{
return (a_m * 100 + a_sm) * (b_m * 100 + b_sm);
}
В теле функции значения, которые передавались в метрах (a_m и b_m)переводятся в сантиметры и суммируются с значениями a_smb_sm, после чего перемножаем суммы и получаем площадь прямоугольника в см. Конечно же можно было перевести исходные данные в сантиметры и пользоваться первой функцией, но сейчас не об этом.
Теперь, самое главное – у нас есть две функции, с разной сигнатурой, но одинаковыми именами (перегруженные функции). Сигнатура – это комбинация имени функции с её параметрами. Как же вызывать эти функции? А вызов перегруженных функций ничем не отличается от вызова обычных функций, например:
areaRectangle( 32, 43); // будет вызвана функция, вычисляющая площадь прямоугольника с двумя параметрами a(см) и b(см)
areaRectangle( 4, 43, 2, 12); // будет вызвана функция, вычисляющая площадь прямоугольника с 4-мя параметрами a(м) a(см); b(м) b(cм)
Как видите, компилятор самостоятельно выберет нужную функцию, анализируя только лишь сигнатуры перегруженных функций. Минуя перегрузку функций, можно было бы просто объявить функцию с другим именем, и она бы хорошо справлялась со своей задачей. Но представьте, что будет, если таких функций надо больше, чем две, например 10. И для каждой нужно придумать осмысленное имя, а сложнее всего их запомнить. Вот именно по этому проще и лучше перегружать функции, если конечно в этом есть необходимость. Исходный код программы показан ниже.
#include<iostream>
usingnamespacestd;
// прототипы перегруженных функций
floatareaRectangle(float a, float b);
floatareaRectangle(float a_m, float a_sm, float b_m, float b_sm);
int main()
{
cout<< "S1 = " <<areaRectangle(32,43) <<endl; // вызовперегруженнойфункции 1
cout<< "S2 = " <<areaRectangle(4, 43, 2, 12) <<endl; // вызовперегруженнойфункции 2
return 0;
}
// перегруженнаяфункция 1
floatareaRectangle(float a, float b) //функция, вычисляющаяплощадьпрямоугольникасдвумяпараметрами a(см) и b(см)
{
return a * b; // умножаем длинны сторон прямоугольника и возвращаем полученное произведение
}
// перегруженная функция 2
floatareaRectangle(floata_m, floata_sm, floatb_m, floatb_sm) // функция, вычисляющая площадь прямоугольника с 4-мя параметрами a(м) a(см); b(м) b(cм)
{
return (a_m * 100 + a_sm) * (b_m * 100 + b_sm);
}