Книги
чёрным по белому
Главное меню
Главная О нас Добавить материал Поиск по сайту Карта книг Карта сайта
Книги
Археология Архитектура Бизнес Биология Ветеринария Военная промышленность География Геология Гороскоп Дизайн Журналы Инженерия Информационные ресурсы Искусство История Компьютерная литература Криптология Кулинария Культура Лингвистика Математика Медицина Менеджмент Металлургия Минералогия Музыка Научная литература Нумизматика Образование Охота Педагогика Политика Промышленные производства Психология Путеводители Религия Рыбалка Садоводство Саморазвитие Семиотика Социология Спорт Столярное дело Строительство Техника Туризм Фантастика Физика Футурология Химия Художественная литература Экология Экономика Электроника Энергетика Этика Юриспруденция
Новые книги
Цуканов Б.И. "Время в психике человека" (Медицина)

Суворов С. "Танк Т-64. Первенец танков 2-го поколения " (Военная промышленность)

Нестеров В.А. "Основы проэктирования ракет класса воздух- воздух и авиационных катапульных установок для них" (Военная промышленность)

Фогль Б. "101 вопрос, который задала бы ваша кошка своему ветеринару если бы умела говорить" (Ветеринария)

Яблоков Н.П. "Криминалистика" (Юриспруденция)
Реклама

Самоучитель С++ - Шилдт Г.

Шилдт Г. Самоучитель С++ — Спб.: БВХ-Петербург, 2003. — 688 c.
ISBN 5-7791-0086-1
Скачать (прямая ссылка): samouchitelc2003.djvu
Предыдущая << 1 .. 18 19 20 21 22 23 < 24 > 25 26 27 28 29 30 .. 206 >> Следующая

Во-вторых, компилятор гораздо лучше работает со встраиваемой функцией, чем с макрорасширением. Как правило, программисты C++ для многократных вызовов коротких функций вместо макросов с параметрами практически всегда используют встраиваемые функции.
Здесь важно понимать, что спецификатор inline для компилятора является запросом, а не командой. Если, по разным причинам, компилятор не в состоянии выполнить запрос, функция будет компилироваться, как обычная функция, а запрос inline будет проигнорирован.
В зависимости от типа вашего компилятора возможны некоторые ограничения на использование встраиваемых функций. Например, некоторые компиляторы не воспринимают функцию как встраиваемую, если функция является рекурсивной или если она содержит либо статическую (static) переменную, либо любую инструкцию выполнения цикла, либо инструкцию switch, либо инструкцию goto. Вам необходимо просмотреть руководство по вашему компилятору, чтобы точно определить ограничения на использование встраиваемых функций.
Если какое-либо ограничение на использование встраиваемой функции нарушено, компилятор генерирует вместо нее обычную функцию.
1. Любая функция может стать встраиваемой, включая функции — члены классов. Например, функция divisible() для ускорения ее выполнения сделана встраиваемой. (Функция возвращает истину, если ее первый аргумент без остатка может делиться на второй.)
// Демонстрация встраиваемой функции-члена #include <iostream> using namespace std;
74 _ Самоучитель C++
class samp { int І г j public:
samp (int a, int b) ;
int divisible{); // встраивание происходит в этом определении
>;
samp: : samp (int a, int b)
{
і = a; j = b;
J
/* Возврат 1, если і без остатка делится на j. Тело этой функции-члена встраивается в программу
*/
inline int samp: :divisible О
{
return ! {і %j) ;
I
int main ()
(
samp obi(10, 2), ob2(10, 3);
// это истина
if(obi.divisible{)) cout « "10 делится на 2Лп";
// это ложь
if(ob2.divisible()) cout << "10 делится на 3\п"; return 0;
]
2. Допускается перегружать встраиваемую функцию. Например, эта программа перегружает тіл () тремя способами. В каждом случае функция также объявляется встраиваемой.
tfinclude <iostream> using namespace std;
// Перегрузка функции min() тремя способами // int
inline int min (int a, int b)
{
return a < b ? a: b;
1
// long
inline long min (long a, long b)
Глава 2. Введение в классы
75
return а < b ? а: Ь;
}
// double
inline double rain (double a, double b)
{
return a < b ? a: b;
}
int main ()
{
cout << min(-10, 10) « "\n";
COUt « min(-10.01, 100.002) « "\n"; COUt « min(-10L, 12L) << "\n"r-
return 0;
1. В главе 1 вы перегружали функцию abs() так, чтобы она находила абсолютные значения типа int, long и double. Модифицируйте программу, чтобы эти функции стали встраиваемыми.
2. Почему следующая функция может не компилироваться как встраиваемая? void fі(>
{
int і;
ford = 0; і < 10; і++) cout « і;
2.7. Встраиваемые функции в объявлении класса
Если определение функции-члена достаточно короткое, его можно включить в объявление класса. Поступив таким образом, мы заставляем, если это возможно, функцию стать встраиваемой. Если функция задается внутри объявления класса, ключевое слово inline не требуется. (Однако использование его в такой ситуации не является ошибкой.) Например, как показано ниже, функция divisibleO из предыдущего раздела может быть по умолчанию сделана встраиваемой:
76
Самоучитель Qi-r
#include <iostream>
using namespace std;
class samp { int і, j ; public:
samp {int a, int b) ;
/* Функция divisible (), которая здесь определяется, по умолчанию становится встраиваемой.
V
int divisible () { return !{i%j); }
і;
samp: : samp (int a, int b)
{
і = a;
j =¦ b;
}
int main (}
{
samp obi (10, 2), ob2(10, 3);
// это истина
if (obi .divisible () ) cout << "10 делится на 2\nM;
// это ложь
if (ob2 .divisible () J cout << "10 делится на 3\ґГг; return 0;
і
Как видите, код функции divisible() находится внутри объявления класса samp. Отметьте, что никакого другого определения функции divisible^) не нужно, это даже запрещено. Определение функции divisible^) внутри класса samp автоматически заставляет ее стать встраиваемой функцией.
Если функция, заданная внутри объявления класса, не может стать встраиваемой функцией (поскольку были нарушены ограничения), она, обычно, преобразуется в обычную функцию.
Отметьте, как именно функция divisib]e() задается внутри класса samp, особенно само тело функции. Оно целиком расположено на одной строке. Такой формат для программ C++ является совершенно обычным, если функция объявляется внутри объявления класса. Такое объявление становится более компактным. Однако класс samp мог бы быть описан и так:
Предыдущая << 1 .. 18 19 20 21 22 23 < 24 > 25 26 27 28 29 30 .. 206 >> Следующая