Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Инициализация объектов
Использование для инициализации объекта, функции типа 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 объекта ссылаются на общую память · Эти объекты не независимы · При уничтожении объектов будет повторная попытка высвобождать ранее высвобожденную память
|