Встраиваемые функции


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

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

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

Для объявления встраиваемой функции указывают спецификатор inline перед определением функции.

// Пример 5.10. Использование встраиваемой функции для определения

//чётности передаваемого ей аргумента.

#include <iostream>

using namespace std;

inline int even(int x){ return !(x % 2); }

int main(){

int chislo;

cout<<"Vvedi chislo"; cin>>chislo;

if(even(chislo)) cout<<chislo<<" - chetnoe"<<endl;

else cout<<chislo<<" - no chetnoe"<<endl;

system("pause");

}

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

 

Некоторые компиляторы не могут сделать функцию встраиваемой, если:

· функция содержит операторы цикла;

· функция содержит операторы switch;

· функция рекурсивная.

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

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

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

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

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

// Пример 5.11. Использование перегруженной функции суммирования:

// двух целых чисел; трёх целых чисел; двух вещественных чисел.

#include <iostream>

using namespace std;

int sum(int a, int b){ return a + b; }

int sum(int a, int b, int c){return a + b +c;}

float sum(float a, float b){return a + b;}

int main(){

int x, y, z;

float p, q;

cout<<"Vvedi int-chisla x, y, z: ";

cin>>x>>y>>z;

cout<<"Vvedi float-chisla p, q: ";

cin>>p>>q;

cout<<"x + y = "<<sum(x, y)<<endl;

cout<<"x + y + z = "<<sum(x, y, z)<<endl;

cout<<"p + q = "<<sum(p, q)<<endl;

system("pause");

}

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

Существует три жёстких ограничения на возможность перегрузки функций.

1.Функции не могут быть перегружены, если они отличаются только типом возвращаемого значения.

2.Функции не могут быть перегружены, если их параметры отличаются только использованием ссылок:

int fun(int par);

int fun(int &par);

3.Функции не могут быть перегружены, если их параметры отличаются только применением спецификатора const:

int fun(int par);

int fun(const int par);



Дата добавления: 2022-05-27; просмотров: 70;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.009 сек.