Ввод-вывод С++. Преобразование типов. Манипуляторы потока., Функции с преопределенными параметрами. Перегрузка функций. Операции new, delete, страница 2

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

Замечания

-------------

а) Работающая Программа должна быть оформлена:

   подписана и иметь структурированный вид

Вопросы для «продвинутых»

-  Что в Лабораторной работе написано не правильно?

-  Что в Лабораторной работе написано плохо?

-  Что в Лабораторной работе пропущено и следует добавить?