
- •Структуры
- •Массив структур
- •Указатели на структуру
- •Битовые поля
- •Объединения
- •Перечисления
- •Переименование типов
- •Открытие файла
- •Функции работы с файлами
- •Форматный ввод/вывод
- •Ввод/вывод строк. Функции позиционирования
- •Чтение из двоичного файла и запись в него
- •Свойства ООП
- •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 Шаблоны классов
необходимости генерировать вызов по ссылке другим способом. Перед параметрами в прототипе и в объявлении функции ставится & – ссылочный параметр.
void swap (int &i, int &j)
{int tmp;
tmp=i;
i=j;
j=tmp ;}
swap (a, b);
Следовательно, передача по ссылке позволяет функциям изменять внешние объекты, как и передача указателей.
Возможно объявление ссылочных переменных, когда они не являются параметрами функции, например, непараметрические ссылки или независимые ссылки. Независимая ссылка должна быть инициализирована при её объявлении, то есть ссылке должен быть присвоен адрес переменной, объявленный до неё. Между переменной и ссылкой нет различия, ссылка становится псевдонимом переменной.
Пример:
#include <iostream>
using namespace std;
main ()
{int j, k; int & i=j;
j=10;
cout << i; k=121;
i=k; cout <<j;
}
i –не зависимая или не параметрическая ссылка, которая является псевдонимом элемента j.
5.2 Передача объектов, как аргументов функции
Объекты передаются таким же образом, как и переменные любого другого типа. При передаче по значению создаётся локальная копия объекта и любые изменения, происходящие с элементами объекта в функции, не изменяют его самого. Может быть вызван конструктор и деструктор, динамически выделена память.
Пример:
#include <iostream.h>
class OBY {int i;
public:
void set_i (int x) {i=x;}
void out_i (void) {cout <<i ;} };
void f (OBY x);
main (void)
{
OBY A;
A.set_i (10);
f (A);
A.out_i ();
}
void f (OBY x)
{
x.out_i();
x.set_i(100);
x.out_i();
}
Можно передать параметр объекта по ссылке, иными словами передать адрес объекта, в таком случае все изменения в функции изменят сам объект.
5.3 Массивы объектов
Массивы объектов создаются так же, как массивы элементов, поэтому можно создавать многомерные массивы объектов.
При создании массивов объекта в классе обязательно должен присутствовать конструктор, имеющий все параметры по умолчанию, конструктор без параметров, или, или вообще конструктора может не быть.
Пример.
class date{
int day, month, year; public:
date (int, int, int); date (int);
date (void);
void set(int, int, int); char * seazon();
int decada();
. . .
};
date::date(int a, int b, int c) {day=a; month=b; year=c;} date::date(int a)
{day=a; month=3; year=2021;} date::date(void)
{day=1; month=1; year=2000;} void date::set(int a, int b, int c) {day=a; month=b; year=c;}
. . .
data day (30, 3, 2007); data md [10];
md [0]. set (1, 1, 2000);
….
md [9]. set (1, 1, 2007);
5.4 Указатель на объект
Как и на другие типы данных ссылаться на объект можно через указатель, при этом доступ к элементам объекта осуществляется при помощи операции “→”, аналогично структурам и объединениям.
Пример:
class example {
int x;
. . .
public:
void set_num (int x1);
. . .};
void example::set_num(int x1)
{ x=x1;}
main (void) {
example ob,*p;
ob.set_num (1);
p=&ob;
p->set_num (2);
. . .}
5.5 Динамическое выделение памяти. Операторы new, delete.
Формат записи:
pointer_var=new type_var;
delete pointer_var;
где pointer_var – указатель на переменную type_var.
Операторnew выделяет соответствующее место для переменной в соответствующей области памяти и возвращает адрес выделенного места, в случае успеха и NULL, если ошибка. Оператор new сам определяет размер типа type_var и возвращает указатель, преобразованный к этому типу.
Выделение памяти под массив:
pointer_var=new type_var [SIZE]
delete [SIZE] pointer_var;
SIZE можно опустить, компилятор знает объем выделенной памяти.
Динамически можно выделить память под объект любого определённого к этому моменту типа. Динамическое выделение памяти под одиночные переменные не выгодно, так как расходуется память и под саму информацию о её выделении. Целесообразно динамически выделять память под массивы больших размеров или под массивы, размерность которых определяется в процессе выполнения программы. Это обычно делается в конструкторе класса.
Пример:
#include <iostream>
using namespace std;
int main (void)
{
int *p;
unsigned int size;
cout <<"Введите длину массива ;"
cin >> size;
p=new int [size];
if (! p)
{
cout<< “Недостаточно памяти;”
return 1;
}
for (int i=0; i<size; i++)
{
p[i] = i*i;
cout<<p[i];
}
delete p;
return 0;