Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
130273_03FB1_shpory_po_obektno_orientirovannomu....doc
Скачиваний:
45
Добавлен:
24.12.2018
Размер:
650.24 Кб
Скачать
  1. Что такое конструктор и для чего он нужен, Какие типы конструктора существуют

В объектно-ориентированном программировании конструктор класса (от англ. constructor, иногда сокращают ctor) — специальный блок инструкций, вызываемый при создании объекта, причём или при его объявлении (располагаясь в стеке или в статической памяти, что допустимо в C++, но не в Java и некоторых других объектно-ориентированных языках) или динамически располагаясь в куче при использовании ключевого слова new.

Конструкторы часто выделяются наличием одинакового имени с именем класса, в котором объявляется. Их задача — инициализировать члены объекта и определить инвариант класса, сообщив в случае некорректности инварианта. Корректно написанный конструктор оставит объект в 'правильном' статусе. Неизменяемые объекты тоже должны быть проинициализированы конструктором.

Виды конструктора:

void main()

{ //вызов конструктора без параметров для создания объекта a:

person a;

//вызов конструктора с параметрами для создания объекта b:

person b("Abram",1977);

//вызов конструктора копирования для создания объекта c:

person c = b;

//вызов конструктора с параметрами для безымянного объекта

//и вызов конструктора копирования для определения объекта d:

person d = person("Gurgen",1942);

//вызов конструктора без параметров для создания безымянного

//объекта, размещаемому по адресу, хранящемуся в указателе pp1:

person* pp1 = new person;

//вызов конструктора с параметрами для создания безымянного

//объекта, размещаемого по адресу, хранящемуся в указателе pp2:

person* pp2 = new person("Ivan",1978);

//вызов конструктора копирования для возврата значения функцией

person e = set_info();

//вызов конструктора копирования для создания объекта-параметра //функции:

print(a); print(b); print(c); print(d);

print(*pp1); print(*pp2); print(e);

}

  1. Отличие конструктора копирования от операции присваивания в С++

Копирующий конструктор предназначен для создания нового объекта по подобию уже существующего, но это не то же самое, что и копирующий оператор присваивания. Тот должен правильно работать с уже созданным объектом.

  1. Деструктор, назначение деструктора.

Если создание объекта подразумевает выделение каких-либо ресурсов, то таким классам требуется функция, которая освободит ресурсы, выделяемые конструктором. Такая функция называется деструктором, она будет автоматически вызвана при уничтожении объекта.

Деструктор не имеет параметров и возвращаемого значения. Вызов деструктора выполняется неявно, при уничтожении объекта класса.

Если в классе деструктор не определен явно, то компилятор генерирует деструктор по умолчанию, который просто освобождает память, занятую данными объекта. В тех случаях, когда требуется выполнить освобождение ресурсов, выделенных конструктором, необходимо определить деструктор явно.

Деструктор вызывается автоматически, когда объект удаляется из памяти:

    • для локальных объектов это происходит при выходе из блока, в котором они объявлены;

    • для глобальныхкак часть процедуры выхода из main;

    • для объектов, заданных через указатели, деструктор вызывается неявно при использовании операции delete.

Имя деструктора начинается с тильды (~), непосредственно за которой следует имя класса.

Свойства деструктора:

    • не имеет аргументов и возвращаемого значения;

    • не наследуется;

    • не может быть объявлен как const или static (см. далее);

    • может быть виртуальным (см. далее).

Если деструктор явным образом не определен, компилятор автоматически создает пустой деструктор.

Описывать в классе деструктор явным образом требуется в случае, когда объект содержит указатели на память, выделяемую динамически — иначе при уничтожении объекта память, на которую ссылались его поля-указатели, не будет помечена как свободная. Указатель на деструктор определить нельзя.

Деструктор для рассматриваемого примера будет выглядеть так:

//реализация деструктора для экземпляра класса

person::~person()

{

delete [] name;

}

Без необходимости явно вызывать деструктор объекта не рекомендуется.

  1. Наследование классов в С++

Наследование – это такое отношение между классами, когда один класс частично или полностью повторяет структуру и поведение другого класса (одиночное наследование) или других (множественное наследование) классов. Наследование устанавливает между классами иерархию "общее-частное".

Связи наследования также называют обобщениями (generalization) и изображают в виде больших белых стрелок от класса-потомка к классу-предку

Рассмотрим учет сотрудников организации. Каждый сотрудник – это, прежде всего, человек. Студент, работник, руководитель – частные случаи объекта "человек", определяющего общие характеристики для всех своих разновидностей. Организация этих понятий в иерархию позволяет избежать повторения кода и обращаться с объектами производных классов как с объектами базового.

Возьмем за основу иерархии класс person, немного изменив его структуру ради соответствия концепции наследования. Поскольку для всех объектов кадровой структуры требуется знать имя, фамилию, а также год рождения для определения возраста, объявим данные атрибуты как protected, заменив заодно тип представления имени и отчества на более удобный в работе тип string.

class person

{

public:

void set_year(int value);

const int get_year() const;

void set_sirname(string& value);

const string& get_sirname() const;

void set_name(string& value);

const string& get_name() const;

protected:

string name;

string sirname;

int year;

};

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]