- •1. Дополнения к с
- •1.1. Комментарии
- •1.2. Ключевые слова
- •1.3. Константы
- •1.4. Блочные объявления
- •1.5. Ссылки
- •1.6. Новая роль имён перечислений, структур и объединений
- •1.7. Распределение памяти
- •1.8. Встраиваемые функции
- •1.9. Перегрузка функций
- •1.10. Задание для параметров функции значений по умолчанию
- •1.11. Дополнительные операции для доступа к данным
- •1.12. Предопределённые потоки ввода-вывода
- •2.1. Инкапсуляция
- •2.2. Разграничение доступа (скрытие данных и методов)
- •2.3. Друзья классов
- •2.4. Конструкторы и деструкторы
- •2.5. Конструктор по умолчанию
- •2.6. Конструктор копирования
- •2.7. Несколько слов о деструкторах
- •2.8. Перегрузка операций
- •3.1. Наследование
- •3.2. Виртуальные функции –полиморфизм
- •3.3. Шаблоны
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, в данном случае, тоже нужно присвоить значение по умолчанию.