- •Структуры
- •Массив структур
- •Указатели на структуру
- •Битовые поля
- •Объединения
- •Перечисления
- •Переименование типов
- •Открытие файла
- •Функции работы с файлами
- •Форматный ввод/вывод
- •Ввод/вывод строк. Функции позиционирования
- •Чтение из двоичного файла и запись в него
- •Свойства ООП
- •1.1 Свойства ООП
- •Понятие класса в С++
- •1.2 Понятие класса С++
- •Создание класса
- •1.3 Создание класса
- •Члены класса
- •1.4 Члены класса
- •Инкапсуляция
- •1.5. Инкапсуляция
- •1.6 Функции-члены класса
- •Реализация понятия «дата» при помощи структуры
- •1.7 Реализация понятия «дата» при помощи структуры
- •Реализация понятия «дата» при помощи класса
- •1.8 Реализация понятия «дата» при помощи класса
- •Определение и вызов функций–членов класса
- •Выводы. Примеры
- •1.9 Выводы
- •1.10 Пример создания класса
- •Конструкторы
- •2.1 Конструкторы
- •2.2 Пример класса без конструктора
- •2.3 Пример класса с конструктором
- •2.4. Конструктор с параметрами по умолчанию
- •2.5. Деструкторы
- •2.6. Пример класса с конструктором и деструктором
- •2.7. Подставляемые или inline функции.
- •2.8. Подставляемые функции-члены.
- •2.9. Указатель this
- •2.10. Использование указателя this
- •Дружественные функции
- •3.1 Дружественные функции
- •3.2 Пример дружественной функции
- •3.3 Дружественные классы
- •3.4. Уточнение имени элемента.
- •3.5. Определение переменных непосредственно перед использованием
- •3.6. Статические элементы класса.
- •2.7. Пример
- •Перегруженные функции
- •4. Перегрузка функций и операций
- •4.1 Полиморфизм
- •4.2 Перегруженные функции
- •4.3 Перегрузка конструктора
- •4.4 Выбор экземпляра функции
- •4.5 Перегрузка стандартных операций
- •4.6 Перегрузка операций сложения и присваивания
- •4.7 Перегрузка операций ++ и --
- •4.8 Дружественные функции-операции
- •4.9 Перегрузка операции индексации []
- •4.10 Аргументы по умолчанию
- •5. Работа с объектами
- •5.1 Ссылки в С++
- •5.2 Передача объектов, как аргументов функции
- •5.3 Массивы объектов
- •5.4 Указатель на объект
- •5.5 Динамическое выделение памяти. Операторы new, delete.
- •5.6 Локальные классы
- •5.7 Вложенные классы
- •5.8 Имена заголовочных файлов в С++
- •5.9 Строковые переменные в С++.
- •6. Наследование
- •6.1 Понятие наследования
- •6.2 Базовые и производные классы
- •6.3 Одиночное и множественное наследование
- •6.4 Управление доступом производных классов
- •6.5 Пример
- •6.6 Конструкторы с параметрами при наследовании
- •6.7 Конструкторы при множественном наследовании
- •7. Виртуальные функции. абстрактные классы
- •7.1 Указатели на производные типы
- •7.2 Виртуальные функции
- •7.3 Пример
- •7.4 Чистые виртуальные функции и абстрактные типы
- •7.5 Виртуальные базовые классы
- •7.6 Шаблоны
- •7.7 Шаблоны функций
- •7.8 Пример
- •7.9 Использование шаблонов с двумя типами параметров
- •7.10 Шаблоны классов
типов, определяемых пользователем. Определение (или перегрузка) операций для таких данных позволяет программисту реализовать более привычную и удобную форму записи для манипулирования объектами, чем та, которая доступна с использованием только базовой функциональной формы записи.
Перегрузка операции выполняется с помощью определения операторной функции следующего формата:
<тип> operator <операция> (список параметров)
{операторы тела функции;}
Функция операции должна быть или членом класса, или дружественной функцией.
В случае внешнего определения (за рамками класса) операция функции примет следующий формат:
<тип> класс::operator <операция> (список параметров)
{операторы тела функции;}
Не могут быть переопределены или перегружены:
1.операция условия «?:»
2.уточнение области видимости «::»
3.Точка «.»
3. sizeof
Перегруженная операция не может иметь параметров с умолчаниями.
4.6 Перегрузка операций сложения и присваивания
C++ позволяет расширить область применимости этих операций, например, для сложения векторов в трёхмерном пространстве. Для этого нужно определить новое поведение стандартной операции “+” применительно к новым типам данных. Это допускается, если хотя бы один из операндов операции является объектом определённого пользователем класса.
Пример: реализовать перегрузку операций сложения и присваивания относительно класса vector
#include <iostream>
using namespace std;
class vector {
int x,y,z;
public:
vector operator+(vector t);
vector operator = (vector t); void show(void);
void assign (int mx, int my, int mz);}; vector vector :: operator + (vector t)
{vector temp; temp.x=x+t.x; temp.y=y+t.y; temp.z=z+t.z; return temp;}
vector vector :: operator=(vector t) {x=t.x;
y=t.y;
z=t.z;
return *this;}
void vector :: show(void) {cout <<x<<y<<z<<"\n";}
void vector :: assign (int mx, int my, int mz) {x=mx;
y=my;
z=mz;} main (void)
{vector a,b,c; a.assign(1,2,3); b.assign(10,10,10); c=a+b;
c.show();
c=a+b+c;
c.show();
c=b=a;
b.show();
c.show();
}
Каждая из функций операции имеет только один параметр, в то время как сами функции определяют бинарные операции. Другой аргумент неявно передаётся с this-указателем. Здесь this ассоциируется с объектом, предшествующим знаку операции. Если используются функции-члены, то не нужны параметры для унарных операций, и требуется лишь один параметр для бинарных операций.
Возвращаемое значение имеет тип vector. Это позволяет использовать выражения типа
a+b+c |
либо |
c=b=a. |
Операция сложения не изменяет своих операндов; операция присваивания модифицирует операнд, стоящий слева.
4.7 Перегрузка операций ++ и --
Подобным образом можно перегрузить ++ и -- : vector vector :: operator ++ (void)
{x++;
y++;
z++;
return *this;}
Чтобы отличить префиксную операцию от постфиксной, в постфиксной добавляют фиктивный целочисленный указатель при описании функции операции:
vector vector :: operator++(int)
{vector tmp;
tmp=*this;
x++;
y++;
z++;
return tmp;}
Значение координат увеличивается, но возвращается старое значение объектов.
4.8 Дружественные функции-операции
Отличие использования дружественных функций-операций состоит в том, что нельзя использовать скрытый указатель this.
Для бинарных операций должны передаваться два аргумента, для унарных – один аргумент.
#include <iostream> using namespace std; class vector {
int x,y,z; public:
friend vector operator+(vector t1, vector t2); friend vector operator ++ (vector &t); vector operator = (vector t);
void show(void);
void assign (int mx, int my, int mz);}; vector operator+(vector t1, vector t2) {vector tmp;
tmp.x=t1.x+t2.x;
tmp.y=t1.x+t2.y;
tmp.z=t1.x+t2.z; return tmp;}
vector vector :: operator=(vector t) {x=t.x;
y=t.y;
z=t.z;
return *this;}
void vector :: show(void)
{cout <<x<<y<<z<<"\n";}
void vector :: assign (int mx, int my, int mz)
{x=mx;
y=my;
z=mz;}
main (void)
{vector a,b,c;
a.assign(1,2,3);
b.assign(10,10,10);
c=a+b;
++c;
c.show();
c=a+b+c;
c.show();
c=b=a;
b.show();
c.show();
}
Перегрузку операции умножения объекта типа vector на целое можно записать и функцией-членом и дружественной функцией. Операцию умножения целого
на vector можно определить только через дружественную функцию.
Перегрузка унарных операций
Перегрузка унарных операций при помощи дружественной функции требует использования ссылки.
vector operator++ (vector &t)
{t.x++;
t.y++;
t.z++;
return t;}