Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие-ООП - копия.doc
Скачиваний:
20
Добавлен:
17.08.2019
Размер:
907.78 Кб
Скачать

Конструкторы и деструкторы. Лекция №7.

Конструктор - это специальная элемент-функция, служащая для инициализации элементов-данных объекта класса. Конструкторы можно разделить на конструкторы инициализации и копирования.

Конструктор характеризуется следующими свойствами:

  • напоминает обычную функцию, но с именем, совпадающим с именем класса, и без типа возвращаемого значения;

  • автоматически вызывается компилятором при объявлении объекта класса; если конструктор отсутствует, то компилятор генерирует конструктор по умолчанию (без параметров), так как он может вызывать конструкторы базовых классов, если они есть;

  • не может быть const, static, virtual и не наследуется;

  • использует два способа инициализации элементов-данных: списком инициализации и телом конструктора; элементы-константы и ссылки инициализируются только списком.

Пример:

class akt

{

int tabn;

float objem;

public: //инициализация списком //инициализация телом

akt(int x, float y): tabn(x), objem(y) //akt(int x,float y)

{} //tabn=x objem=y //{tabn=x; objem=y;}

};

main() //}

{

akt obj1(1,100000);//x=1 y=100000

}

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

  • имеет в качестве параметра либо константную ссылку на объект класса, например, const akt& obj, либо простую ссылку на объект, например, akt& objconst предпочтительней);

  • если конструктор копирования отсутствует, то компилятор генерирует конструктор по умолчанию; этот конструктор копирует все элементы-данные копируемого объекта.

Добавим в предыдущий пример конструктор копирования.

class akt main()

{ ... {

akt(const akt& obj) akt obj1(1,100000);

{ ...

tabn=obj.tabn; //копирование obj1 в obj2

objem=obj.objem; akt obj2=obj1;//или akt obj2(obj1);

} ...

}; }

Деструктор служит для уничтожения объектов класса. Деструктор характеризуется следующими свойствами:

  • имеет имя класса с префиксом-тильдой (~) и не имеет возвращаемого значения и параметров, например, ~akt();

  • автоматически вызывается компилятором при выходе из области видимости или при выполнении операции delete для объектов, размещенных в динамической памяти при помощи операции new;

  • не может быть const, static, virtual , и не наследуется.

Друзья класса

Доступ к элементам защищенной (protected) и закрытой (private) частей класса из внешних функций или из функций других классов (не производных) запрещен. Но можно обойти этот запрет, объявив функцию или целый класс дружественной данному классу. Другом класса может быть: внешняя функция, элемент-функция другого класса, целый другой класс.

Использование друзей класса - достаточно спорный прием, так как он нарушает одно из основных понятий - инкапсуляцию. Поэтому, необходимы обоснованные причины, например, необходимость привилегированного доступа какой-то функции (по сравнению с другими) к элементам нескольких классов.

Синтаксис объявления друзей класса:

class cl1

{

friend tf1 f1(ta1 a1[,...]); //внешняя функция

friend tf2 cl3::f2(tb1 b1[,...]);//функция класса cl3

friend class cl2; //класс cl2

...

};

Друзья класса характеризуются следующими свойствами:

  • объявляются со словом friend в любой части класса;

  • могут быть дружественными более чем одному классу;

  • не могут быть взаимно друзьями; если класс cl2 является другом cl1, то это не означает, что cl1 является другом cl2;

  • дружественность не наследуется производными классами друга; если cl2 - друг cl1, то производные классы от cl2 не являются друзьями cl1;

  • дружественность не наследуется производными классами от данного класса; если cl2 - друг cl1, то это не означает, что cl2 является другом классам, производным от cl1;

  • дружественность не транзитивна; если cl2 - друг cl1, то это не означает, что друзья cl2 являются друзьями cl1.