Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Язык программирования С++ и его «подводные камни».DOC
Скачиваний:
39
Добавлен:
01.05.2014
Размер:
1.02 Mб
Скачать

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

Спецификатор inline предназначен для использования перед объявлением функции, чтобы компилятор помещал ее код непосредственно в место вызова:

// Код этой функции будет подставлен в каждом месте вызова

inline void Swap (float & a, float & b);

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

Примечание

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

  • если это рекурсивная функция;

  • если имеется вызов из определенной ранее встроенной функции;

  • если в функции имеются циклы.

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

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

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

несколько функций с одним и тем же именем, но с различным числом и типами аргументов:

int Sort (char ** str); // сортирует массив строк

int Sort (int *, int); // сортирует массив целых чисел

int Sort(double *, int); // сортирует массив вещественных чисел

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

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

1.10. Задание для параметров функции значений по умолчанию

В дополнении к возможностям, имеющимся в С, в языке С++ появилась еще одна теперь при объявлении или определении можно задавать значе­ния некоторых ее параметров по умолчанию:

float Multi (float fFirst, float fSecond,

float fThird = 1, float fFourth = 1)

{

return (fFirst * fSecond * fThird * fFourth);

При вызове этой функции такие параметры можно не указывать:

. . .

float fResult;

fResult = Multi (2, 3, 4, 5); // произведение четырех чисел: fResult = 120

fResult = Multi (2, 3, 4); // произведение трех чисел: fResult: = 24

fResult = Multi (2, 3); // произведение двух чисел: fResult = 6

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

Здесь следует учитывать одно ограничение:присваивание значений, заданных по умолчанию, должно выполняться справа налево. Поэтому следующая запись недопустима:

double func (double dArg1 = 7, double dArg2); // так нельзя

Если необходимо указать значение по умолчанию для dArg1, то и dArg2, в данном случае, тоже нужно присвоить значение по умолчанию.