Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Инициализация объектов






Использование для инициализации объекта, функции типа setdata черевато ошибками. Ответственность за своевременное и строго однократное применение/вызов, лежит на программисте. Программист может не вызывать функцию перед использованием объекта. Программист может вызывать функцию 2 раза, что при выделении памяти, что при динамическом выделении памяти, может привести к утечке памяти.

Что бы избежать этих ошибок, в ОО языках была добавлена специализированая функция, явно предназначенная для инициализации создаваемых объектов. Такая функция будет гарантировано вызвана ровно один раз. Это функция специального вида и отличается от других.

Особенности конструктора:

· Его имя совпадает с именем класса

· Тип результата не указывается

· Параметры у конструктора могут быть любыми

· Конструкторы можно перегружать

Data(); // конструктор по умолчанию

Date(int, int, int);

Date(int);

Date(int, int);

Date(char);

//-----------------------------------------------------

Date today(11); // сокр.

date today = date(11); //полная форма

date myday; // date();

date a(“11 sep 2013”);

date b(12, 08);

 

Размножение конструктора для некоторого разрабатываемого типа, характерно для ОО языков

Иногда инициализирующий и конструктор по умолчанию совмещают

Конструктор без параметров называется инициализирующим. Если его для класса явно не указать, то в языке С++ будет ошибка при создании переменной без параметра.

Любой конструктор с параметром называется инициализирующим.

Кроме того, выделяют понятие «копирующего конструктора». Это особый инициализирующий конструктор, который вызывается в момент инициализации посредством присваивания.

Date md = myday; // в данной записи создается новый объект с именем md, который в момент создания инициализируется с значением ранее созданного объекта myday

Date md(myday)

Если копирующий конструктор не определен, то произойдет побитовое копирование объекта myday в md. Если не используется динамическое создание объекта, то ошибок не будет. Если в объекте используются указатели, то побитовое копирование недопустимо.

Если производится побитовое копирование полей с динамическим выделением памяти(копируются значения адреса, на которое ссылается поле) получается, что 2 объекта ссылаются на общую память

· Эти объекты не независимы

· При уничтожении объектов будет повторная попытка высвобождать ранее высвобожденную память






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.