inta, *point1, *point2; // выделяют места в стеке для этих переменных
Операция new (С++) позволяет выделить место в свободной области памяти . Эта область памяти называют HEAP – «куча» . Операции new надо сообщить: сколько и как организованной памяти нам необходимо. Если операция выполнена успешно, то будет возвращён адрес выделенной области памяти. Этот адрес можно присвоить соответствующему указателю.
Так как место в памяти выделяется в процессе выполнения программы, то такую память называют ДИНАМИЧЕСКОЙ.
point2 = new int; // выделение места в "куче" - HEAP (в свободной области памяти)
В памяти выделено ровно столько места, сколько занимает одно целое.
Адрес выделенного места памяти заносится в указатель point2.
Посмотрите на адреса памяти выделяемые операцией new. Сравните эти адреса с адресами памяти, выделяемые под обычные (auto) переменные в стеке.
С динамической памятью можно работать только через указатели, которые на неё показывают. Поэтому необходимо внимательно следить за указателями, работающими с динамической памятью, так как при их «потере» теряется доступ к выделенной памяти.
point1 = newint;
point2 = point1; //потеряли область стека, отведенную для " point2 = new int "
Операция delete освобождает выделенную динамическую память. Необходимо быть внимательным , чтобы у нас не получались указатели показывающие не известно куда.
deletepoint1; // указатель point2 "повис", так как point2 = point1 , а значение point1 стало неопределено (точнее область памяти возвращена операционной системе, и на неё показывает point2).
Синтаксис освобождения динамической памяти для массива:
delete [ ] c_point; //"освобождение" массива
Небольшой пример выделения места в памяти для матрицы и особождения его приведен в программе Dc_9a.cpp .
10) программа Dc_10.cpp
Перегрузка функций.
В программе вводятся 3 функции с одним и тем же именем do_stuff , но они различаются по типам параметров. Для построения правильного кода компилятору необходимо уметь правильно определять, какую именно функцию ему неообходимо вызвать. Для этого компилятор ищет точное соответствие по параметрам (сопоставляется количество и тип параметров). Если точного соответствия нет, то компилятор пытается найти подходящий прототип функции, если выполнить подходящие стандартные преобразования.
11) программа Dc_11.сpp
Ссылочный тип данных
1) «Не параметрическая» Ссылка
inta = 1;
int * pa = &a;
так мы создали переменную a и указатель pa, в который записали адрес переменной a
int & sa = a;
Так объявляется новая переменная sa, она имеет тип - ссылка на целое. Такая Ссылка обязательно должна быть проинициализирована. Ссылка вводит новое имя для переменной a. Ссылка sa - это псевдоним для переменной a.
Это видно по выдаче
cout << "sa =" << sa << endl;
2) параметрическая ссылка (использование ссылки, как параметра функции )
Вызовем функцию change( )
change(a);
Мы передаем а по значению. Но функция принимает не по значению : voidchange(intb)
, а по ссылке voidchange(int & sb)
- в качестве формального параметра стоит параметрическая ссылка sb
В этом случае создание переменной sb происходит при вызове функции. Одновременно, в этот момент, эта ссылка инициализируется
int & sb = a.
В этом случае sb –это синоним (псевдоним) для a.
Поэтому изменение sb поменяет a в исходной программе
{
sb=10; // меняется переменная а, полученная по ссылке
}
Вернувшись в главную программу, убеждаемся в этом:
cout << "change(a) =" << a << endl;
12) программа Dc_11.сpp
В этом примере тип rectangle определяется не как структура а, как класс.
В классе вводятся ограничения на доступ к его элементам (полям, членам).
У класса существует ЗАКРЫТАЯ (private) часть класса и ОТКРЫТАЯ (public) часть класса.
С открытой частью класса можно работать также, как с полями структуры (открытыми).
Доступ к закрытой части класса ограничен.
Все члены класса rectangle находятся в закрытой части класса. Поэтому, не возможно их использование, как для структур
// box.height = 12; - так можно писать для структуры, но не для класса.
Для работы с членами класса можно использовать только член-функции класса, которые объявлены в открытой части класса - box.initialize(12, 10); .
Член-функции area( ), initialize( ) – объявлены внутри класса, но не определены.
Их определение вынесено из класса. Поэтому при определении этих функций необходимо указывать, к какому типу данных относятся эти функции. Разные типы данных могут иметь член-функции с одинаковыми названиями. Чтобы не было путаницы, при определении член-функций, используется операция ::- это операция принадлежности, и она указывает компилятору к какому классу относится эта член-функция.
voidrectangle::initialize( )
Посмотрите, что будет если тип rectangle определить, как структуру. Можно ли тогда обратиться к закрытой части? Что будет если член-функция area объявлена в закрытой части структуры?
Задание (учебное):
Требуется решить 2 задачи 2500, 2501.
Задание (проверочное):
Требуется решить 2 задачи 2511, 2512
-------------
а) Работающая Программа должна быть оформлена:
подписана и иметь структурированный вид
Вопросы для «продвинутых»
- Что в Лабораторной работе написано не правильно?
- Что в Лабораторной работе написано плохо?
- Что в Лабораторной работе пропущено и следует добавить?
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.