- •1.1.1 Пример программы, выводящей текст на экран (пример 1)
- •1.1.2 Директивы препроцессору (подключение заголовочных файлов)
- •1.1.3 Комментарии
- •1.1.4 Функции
- •1.1.5 Ввод и вывод на экран
- •1.2. Переменные и их объявление
- •1.2.1 Пример программы cложения целых чисел (пример 2)
- •1.2.2 Переменные и их объявление
- •1.3. Арифметические операторы
- •1.3.1 Примеры арифметических операций (пример 3)
- •1.3.2 Группировка подвыражений с помощью скобок
- •1.4. Логические выражения и оператор if
- •1.4.1 Условные конструкции. Пример условных конструкций (пример 4)
- •1.4.2 Логические выражения. Логические операции и, или, не (пример 5)
- •1.4.3 Типичные ошибки
- •1.4.4 Вложенные условия
- •1.5. Арифметический логический оператор (пример 6)
- •1.6. Селективные конструкции
- •1.6.1 Селективные конструкции. Пример определения оценки в зависимости от количества баллов (пример 6)
- •1.6.2 Оператор Switch. Пример меню с выбором действия (пример 7)
- •1.7. Циклы while и do…while
- •1.7.1 Цикл с предусловием while. Пример возведения в степень в цикле (пример 8)
- •1.7.2 Цикл с постусловием do...While
- •1.8. Пошаговый цикл for
- •1.8.1 Пример работы оператора for - вычисление суммы чисел (пример 9)
- •1.8.2 Пошаговый цикл for
- •1.8.3 Операторы break и continue
- •1.8.4 Пример вычисление факториала (пример 10)
- •1.9. Функции
- •1.9.1 Использование функций библиотеки stl (пример 11)
- •1.9.2 Определение новых функций
- •1.9.3 Пример функции (пример 12)
- •1.10. Размещение программ и данных в памяти
- •1.11. Ссылки и указатели
- •1.11.1. Ссылки
- •1.11.2. Указатели
- •1.11.3. Передача параметров в функцию по ссылке и указателю
- •2.2 Организация ввода/вывода
- •2.3 Строковые переменные и константы
- •2.4 Математические функции
- •3.1. Массивы
- •3.1.1. Одномерный массив
- •3.1.2. Динамическое размещение одномерного массива
- •3.1.3. Передача массива в функцию (пример 3.1)
- •3.1.4. Двумерный массив
- •3.1.5. Динамическое размещение двумерного массива (пример 3.2)
- •3.2 Контейнеры
- •3.3. Вектор vector (пример 3.3)
- •4.4. Список list
- •3.4.1. Списки
- •3.4.2. Итераторы
- •3.4.3. Пример работы со списком с использованием итераторов (пример 3.4)
- •3.5. Очереди и стек
- •3.5.1. Двусторонняя очередь deque (пример 3.5)
- •3.5.2. Стек stack
- •3.5.3. Очередь queue
- •3.6. Ассоциативные контейнеры
- •3.6.1. Контейнер map (пример 3.7)
- •3.6.2. Контейнер set (пример 3.8)
- •3.7. Алгоритмы
- •4.1 Структуры
- •4.1.1. Пример 4.1. Структура для работы с компонентами цвета
- •4.1.2. Передача абстрактных типов в функцию
- •4.1.3. Создание функций-членов для абстрактного типа данных. Пример 4.2. Структура для работы с компонентами цвета со встроенной функцией.
- •4.2. Классы
- •4.2.1. Пример 4.3. Класс Линза
- •4.2.2. Директивы препроцессору # if ! defined, # endif (проверка на повторное подключение)
- •4.2.3. Тип доступа к членам класса
- •4.2.4. Принципы объектно-ориентированного проектирования
- •4.2.5. Типы функций-членов класса
- •4.3 Конструкторы и деструкторы класса
- •4.3.1. Конструкторы
- •4.3.2. Деструктор (пример 4.4. Конструктор и деструктор класса Матрица)
- •4.3.3. Проверка правильности параметров. Исключительные ситуации
- •4.4. Модификаторы, селекторы и другие члены классов
- •4.4.1. Модификаторы и селекторы
- •4.4.2. Ключевые слова const и inline
- •4.4.3. Функции-утилиты
- •4.4.4. Сохраняемость
- •5.1. Типы наследования. Видимость членов классов
- •5.1.1. Наследование
- •5.1.2. Пример 5.1. Линза и зеркало как оптические детали
- •5.1.3. Последовательность вызова конструкторов
- •5.1.4. Типы наследования. Видимость членов классов
- •5.1.5. Множественное наследование
- •5.2. Виртуальные функции. Абстрактные классы
- •5.2.1. Виртуальные функции
- •5.2.2. Абстрактные классы
- •6. Полиморфизм
- •6.1. Перегрузка функций
- •6.1.1. Перегрузка функций
- •6.1.2. Преобразование типов
- •6.1.3. Параметры функций по умолчанию
- •6.2. Перегрузка операторов
- •6.2.1. Пример 6.1 (класс Complex (комплексное число))
- •6.2.6. Перегрузка операторов с присваиванием
- •6.2.7. Перегрузка преобразования типов
- •6.2.8. Перегрузка оператора доступа по индексу
- •6.2.9. Перегрузка операторов ввода/вывода
- •6.2.10. Неперегружаемые операторы
- •6.3. Шаблоны функций и классов
- •6.3.1. Шаблоны функций. Пример 6.2 (шаблон функции)
- •6.3.2. Шаблоны функций с несколькими параметрами. Пример 6.3 (шаблон функции с несколькими параметрами)
- •6.3.3. Шаблоны классов. Пример 6.4 (шаблон класса Комплексное число)
- •6.4. Объекты-функции. Предикаты
- •6.4.1. Объекты-функции. Пример 6.5 (использование объектов-функций)
- •6.4.2. Предикаты. Пример 6.6 (использование предикатов)
6. Полиморфизм
Полиморфизм – это возможность принимать множество форм, иметь разный смысл в зависимости от ситуации.
Полиморфизм в языке С++ позволяет программисту:
Создавать функции, имеющие одинаковые имена, но разные наборы аргументов по количеству и по типу данных - перегрузка функций. При этом в зависимости от набора аргументов и их типов будет вызываться та или иная функция, хотя они имеют одинаковые имена.
Определять действие операторов для абстрактных типов данных - перегрузка операторов. В результате для абстрактных типов данных можно использовать привычные операторы: + для сложения или объединения двух объектов, = для присвоения одного экземпляра объекта другому и т.д.
6.1. Перегрузка функций
6.1.1. Перегрузка функций
Как правило, разным функциям дают различные имена, но когда функции выполняют одинаковые действия, но для объектов разных типов, может оказаться удобным присвоить одно и то же имя.
Использование одного имени для функций, выполняющих действия с аргументами разных типов, называется перегрузкой.
функции, выполняющие одинаковые действия для разных типов: |
перегруженные функции: |
print_double(double d); print_Lens(Lens l); print_2(double x, double y); |
void print(double d); void print(Lens l); void print(double x, double y); |
Все эти функции имеют одинаковое имя, но разный набор параметров, поэтому компилятор легко отличит их друг от друга при вызове по набору аргументов. Процесс поиска подходящей функции из набора перегруженных осуществляется компилятором по следующим правилам:
Проверка точного соответствия типов аргументов функции и передаваемых параметров
Попытка “повышения типов” (short -> int, flot -> double и т.д.)
Попытка стандартных преобразований (int -> double, double -> int, указатели -> void* и т.д.)
Преобразование, явно задаваемое программистом
Возвращаемые типы не участвуют в определении какую из перегруженных функций вызвать.
float sqrt(float);
float sqrt(double);
double sqrt(double);
6.1.2. Преобразование типов
Правила автоматического преобразования типов
bool, char повышается до int
int < long < flot < double. Операнд более низкого типа повышается до более высокого.
Явное преобразование типов:
(тип) выражение - ( int) x;
тип (выражение) – int (x);
Для классов для преобразования типов используется конструктор с одним параметром:
// преобразование из double в Complex
Complex::Complex(double x)
{
m_re=x;
m_im=0.;
}
// пример использования
Complex x;
x=Complex(3.14);
Однако для некоторых типов данных использование конструктора для преобразования типа не имеет смысла и может приводить к нежелательным последствиям. Оператор explicit запрещает неявный вызов конструктора для преобразования типа:
// оператор explicit запрещает неявный вызов конструктора для преобразования типа
class Matrix
{
public:
explicit Matrix(int size);
}
Matrix::Matrix(int size)
{
m_data=new double[size*size];
}
