- •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.3.3. Шаблоны классов. Пример 6.4 (шаблон класса Комплексное число)
Шаблоны позволяют реализуют в языке С++ такое отношение между классами, как инстанцирование. При создании шаблона класса тип одного или нескольких его переменных членов задаются в качестве параметра. При использовании этого шаблона необходимо будет указать, какой тип использовать в качестве параметра. Это и называется инстанцированием. Например, обобщенный класс Complex. Многие классы, которые используются для хранения и управления гомогенными структурами данных, реализуют в виде шаблонов. И действительно, независимо от типов хранимых в нем элементов, класс Complex должен выполнять одни и те же функции
Процесс генерации объявления класса по шаблону и аргументу называется инстанцированием шаблона.
/////////////////////////////////////////////////////////////////////////////
// Прикладное программирование
// Пример 6.4. Шаблон класса Комплексное число
// complex.h
//
// Кафедра Прикладной и компьютерной оптики, http://aco.ifmo.ru
// СПб НИУ ИТМО
/////////////////////////////////////////////////////////////////////////////
// проверка на повторное подключение файла
#if !defined COMPLEX_H
#define COMPLEX_H
#include <iostream>
using namespace std;
/////////////////////////////////////////////////////////////////////////////
// шаблон класса Комплексное число
template <class PAR>
class Complex
{
private:
// вещественная и мнимая часть комплексного числа
PAR m_re, m_im;
public:
// конструкторы
Complex<PAR>();
Complex<PAR>(PAR re, PAR im=PAR(0));
Complex<PAR>(const Complex<PAR>& other);
public:
// получение параметров комплексного числа
PAR GetRe() const;
PAR GetIm() const;
// изменение параметров комплексного числа
void Set(PAR re, PAR im=PAR(0));
// оператор умножения
Complex<PAR> operator*(const Complex<PAR>& other) const;
// оператор умножения на число
Complex<PAR> operator*(const PAR& other) const;
// оператор умножения с присваиванием
Complex<PAR>& operator*=(const Complex<PAR>& other);
// оператор присваивания
Complex<PAR>& operator=(const Complex<PAR>& other);
// оператор равенства
bool operator== (const Complex<PAR>& other) const;
// оператор сопряжения комплексного числа
Complex<PAR> operator~() const;
// унарный минус
Complex<PAR> operator-() const;
// ввод/вывод комплексного числа
template <class PAR>
friend ostream& operator<< (ostream& out, const Complex<PAR>& x);
template <class PAR>
friend istream& operator>> (istream& out, Complex<PAR>& x);
};
/////////////////////////////////////////////////////////////////////////////
// конструктор по умолчанию
template <class PAR>
Complex<PAR>::Complex()
: m_re(0.)
, m_im(0.)
{
}
/////////////////////////////////////////////////////////////////////////////
// полный конструктор
template <class PAR>
Complex<PAR>::Complex(PAR re, PAR im)
: m_re(re)
, m_im(im)
{
}
/////////////////////////////////////////////////////////////////////////////
// конструктор копирования
template <class PAR>
Complex<PAR>::Complex(const Complex<PAR>& x)
: m_re(x.m_re)
, m_im(x.m_im)
{
}
////////////////////////////////////////////////////////////////////////////
// получение вещественной части комплексного числа
template <class PAR>
PAR Complex<PAR>::GetRe() const
{
return m_re;
}
/////////////////////////////////////////////////////////////////////////////
// получение мнимой части комплексного числа
template <class PAR>
PAR Complex<PAR>::GetIm() const
{
return m_im;
}
/////////////////////////////////////////////////////////////////////////////
// изменение параметров комплексного числа
template <class PAR>
void Complex<PAR>::Set(PAR re, PAR im)
{
m_re=re;
m_im=im;
}
/////////////////////////////////////////////////////////////////////////////
// оператор умножения
template <class PAR>
Complex<PAR> Complex<PAR>::operator*(const Complex<PAR>& other) const
{
return Complex<PAR>(m_re*other.m_re-m_im*other.m_im,
m_re*other.m_im-m_im*other.m_re);
}
/////////////////////////////////////////////////////////////////////////////
// оператор умножения на число
template <class PAR>
Complex<PAR> Complex<PAR>::operator*(const PAR& other) const
{
return Complex<PAR>(m_re*other, m_im*other);
}
/////////////////////////////////////////////////////////////////////////////
// оператор умножения с присваиванием
template <class PAR>
Complex<PAR>& Complex<PAR>::operator*=(const Complex<PAR>& other)
{
Complex temp(*this);
m_re=temp.m_re*other.m_re - temp.m_im*other.m_im;
m_im=temp.m_re*other.m_im + temp.m_im*other.m_re;
return (*this);
}
/////////////////////////////////////////////////////////////////////////////
// унарный минус
template <class PAR>
Complex<PAR> Complex<PAR>::operator-() const
{
return Complex<PAR>(-m_re, -m_im);
}
/////////////////////////////////////////////////////////////////////////////
// оператор сопряжения комплексного числа
template <class PAR>
Complex<PAR> Complex<PAR>::operator~() const
{
return Complex<PAR>(m_re, -m_im);
}
/////////////////////////////////////////////////////////////////////////////
// оператор равенства
template <class PAR>
bool Complex<PAR>::operator== (const Complex<PAR>& other) const
{
return (m_re == other.m_re && m_im == other.m_im);
}
/////////////////////////////////////////////////////////////////////////////
// оператор присваивания
template <class PAR>
Complex<PAR>& Complex<PAR>::operator=(const Complex<PAR>& other)
{
if(this != &other)
{
m_re=other.m_re;
m_im=other.m_im;
}
return *this;
}
/////////////////////////////////////////////////////////////////////////////
// вывод комплексного числа на экран
template <class PAR>
ostream& operator<< (ostream& out, const Complex<PAR>& x)
{
return (out<<"("<<x.m_re<<","<<x.m_im<<")");
}
/////////////////////////////////////////////////////////////////////////////
// ввод комплексного числа с клавиатуры
template <class PAR>
istream& operator>> (istream& in, Complex<PAR>& x)
{
return (in>>x.m_re>>x.m_im);
}
/////////////////////////////////////////////////////////////////////////////
#endif //defined Complex_H
/////////////////////////////////////////////////////////////////////////////
// Прикладное программирование
// Пример 6.4. Шаблон класса Комплексное число
// test_complex.cpp
//
// Кафедра Прикладной и компьютерной оптики, http://aco.ifmo.ru
// СПб НИУ ИТМО
/////////////////////////////////////////////////////////////////////////////
#include <iostream>
using namespace std;
// подключение описания класса
#include "complex.h"
/////////////////////////////////////////////////////////////////////////////
// пример использования шаблона класса Complex
void main()
{
Complex<int> a(5), b(3,3);
Complex<double> c(1.144, -0.155);
cout<<a<<" "<<b<<" "<<c<<endl;
}
/////////////////////////////////////////////////////////////////////////////
