- •Введение. Принципы объектно-ориентированного программирования
- •Глава 1. Классы и объекты
- •1.1. Операция разрешения области видимости ::
- •1.2. Перечислимый тип
- •1.3. Модификатор const
- •1.4. Новый тип данных – ссылка &
- •Inline определение_функции
- •2. Определение класса. Сокрытие информации.
- •3. Объект.
- •4. Конструкторы и деструкторы
- •4.1.Назначение конструктора
- •4.2. Конструктор копирования
- •X::X(X&); // где X – имя класса
- •4.3. Деструктор
- •5. Неявный указатель this
- •6. Перегрузка операций
- •7. Примеры перегрузки некоторых операций
- •7.1. Перегрузка операции [ ]
- •7.2. Перегрузка операции ()
- •7.6. Перегрузка операции (тип)
- •8. Дружественность
- •Istream
- •10. Массивы объектов.
- •11. Функции- и классы-шаблоны
- •11.1 Функции-шаблоны (родовые функции)
- •11.2 Классы-шаблоны
- •12. Член-данные класса – объекты другого класса: агрегированные классы.
- •Глава 2. Наследование. Полиморфизм
- •1. Базовый и порожденный классы
- •2. Конструкторы порожденного класса
- •3. Стандартные преобразования при наследовании
- •4. Множественное наследование. Виртуальный базовый класс
- •4.1. Прямые базовые классы
- •4.2. Виртуальный базовый класс
- •5. Полиморфизм, раннее и позднее связывание, виртуальные функции
- •5.1 Раннее (статическое) и позднее (динамическое) связывание
- •5.2. Определение виртуальной функции
- •5.3. Чистая виртуальная функция и абстрактный класс
- •5.4. Правила определения виртуальных функций
- •5.5. Механизм позднего связывания
- •6. Библиотека fstream – работа с файлами
- •Глава 3. Библиотека стандартных шаблонов (бсш). Контейнеры
- •1. Контейнер. Структура бсш.
- •2. Контейнер Vector – динамический массив
- •Контейнер list – список
- •4. Контейнер Set – множество
- •Содержание
- •Глава 1. Классы и объекты
- •Глава 2. Наследование. Полиморфизм
- •Глава 3. Библиотека стандартных шаблонов (бсш). Контейнеры
Inline определение_функции
В этом случае компилятор при каждом обращении просто подставляет код тела функции в место вызова. Такие функции называются встраиваемыми.
Ограничение на inline-функции:
объявление и определение таких функций должны совпадать;
с ключевым словом inline определяют только маленькие функции, в частности, не содержащие циклов и переключателя.
г) аргументы по умолчанию
В С++ при вызове функции можно не задавать фактические аргументы, компилятор их подставит автоматически, если в определении функции задано их некоторое значение.
Например,
void Line(int k, char s = ’*’) // s – аргумент по умолчанию
{int i;
for(i = 0; i < k; i++) cout << s;
}
Возможные обращения
Line(10); // выведутся 10 ‘*’
Line(50); // выведутся 50 ‘*’
Line(20,’!’); // выведутся 20 ‘!’
Можно задать несколько аргументов по умолчанию, но в списке они должны идти последними.
Например,
void Prx(double x, int k = 30, char s = ’*’) {...}
Возможны обращения
Prx(15.5); // x = 15.5, k = 30, s = ‘*’
Prx(x, 20); // x = x, k = 20, s = ‘*’
Prx(2 * x, 10, ’+’); // x = 2 * x, k = 10, s = ‘+’
Неверно обращение
Prx(5, , ’!’);
д) перегрузка функций
Это одно из проявлений полиморфизма в С++. Перегрузка функций – это использование одинаковых имен для однотипных функций.
Рассмотрим пример.
Пусть требуется написать 3 функции вывода:
массива a из m целых чисел;
длинного целого числа;
строки символов.
Начинаем работу с «придумывания имен», например:
void Printm(int * a, int m) для массива,
void Printl(long n) для длинного целого,
void Prints(char * s) для строки.
В С++ все эти 3 функции могут быть заданы одним именем.
void Print(int * a, int m),
void Print (long n),
void Print(char * s).
Поскольку список формальных аргументов у каждой функции разный, то есть отличается количеством и/или типом (говорят – сигнатурой), то при вызове функций компилятор по списку фактических аргументов разберется, какой экземпляр функции требуется вызвать.
Print(“Hello!”); // функция Print(char *)
Print(a, 20); // функция Print(int *, int)
Print( 50l ); // функция Print(long)
е) передача функции константных параметров
Модификатор const может быть задан в списке формальных аргументов при определении функции. В этом случае мы хотим подчеркнуть, что значение фактического аргумента функция не имеет права изменять
Например,
void Func(const char * s)
{.....
s[0] = ’A’; // компилятор выдаст сообщение об ошибке
}
ж) константное возвращаемое значение
Рассмотрим пример
const char * GetName(); // объявление
void main()
{const char * cp = GetName(); // cp – указатель на константу
const char * np = “Иван”; // np – тоже указатель на константу
cp[2] = ’н’ // ошибка
…
cp = np; // можно: cp – не константа
...
}
const char * GetName()
{return “Дима”;}
