Продемонстрируем использование встраиваемой функции на примере следующей программы.
#include <iostream>
using namespace std;
class cl {
int i; // закрытый член по умолчанию
public:
int get_i();
void put_i(int j);
};
inline int cclass="underline" :get_i()
{
return i;
}
inline void cclass="underline" :put_i(int j)
{
i = j;
}
int main()
{
cl s;
s.put_i(10);
cout << s.get_i();
return 0;
}
Здесь вместо вызова функций get_i() и put_i() подставляется их код. Так, в функции main() строка
s.put_i(10);
функционально эквивалентна следующей инструкции присваивания:
s.i = 10;
Поскольку переменная i по умолчанию закрыта в рамках класса cl, эта строка не может реально существовать в коде функции main(), но за счет встраивания функции put_i() мы достигли того же результата, одновременно избавившись от затрат системных ресурсов, связанных с вызовом функции.
Важно понимать, что в действительности использование модификатора inline является запросом, а не командой, по которой компилятор сгенерирует встраиваемый (inline-) код. Существуют различные ситуации, которые могут не позволить компилятору удовлетворить наш запрос. Вот несколько примеров.
■ Некоторые компиляторы не генерируют встраиваемый код, если соответствующая функция содержит цикл, конструкцию switch или инструкцию goto.
■ Чаще всего встраиваемыми не могут быть рекурсивные функции.
■ Как правило, встраивание "не проходит" для функций, которые содержат статические (static) переменные.
Узелок на память. Ограничения на использование встраиваемых функций зависят от конкретной реализации системы, поэтому, чтобы узнать, какие ограничения имеют место в вашем случае, обратитесь к документации, прилагаемой к вашему компилятору.
Существует еще один способ создания встраиваемой функции. Он состоит в определении кода для функции-члена класса в самом объявлении класса. Любая функция, которая определяется в объявлении класса, автоматически становится встраиваемой. В этом случае необязательно предварять ее объявление ключевым словом inline. Например, предыдущую программу можно переписать в таком виде.
#include <iostream>
using namespace std;
class cl {
int i; // закрытый член по умолчанию
public:
// автоматически встраиваемые функции
int get_i() { return i; }
void put_i(int j) { i = j; }
};
int main()
{
s.put_i(10);
cout << s.get_i();
return 0;
}
Здесь функции get_i() и put_i() определены в теле объявления класса cl и автоматически являются встраиваемыми.
Обратите внимание на то, как выглядит код функций, определенных "внутри" класса cl. Для очень небольших по объему функций такое представление кода отражает обычный стиль языка C++. Однако можно сформатировать эти функции и таким образом.
class cl {
int i; // закрытый член по умолчанию
public:
// встраиваемые функции
int get_i()