Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ГОС_ответы.doc
Скачиваний:
35
Добавлен:
27.10.2018
Размер:
21.59 Mб
Скачать

17 Ооп. Визначення класу. Конструктор, перевантажені конструктори, деструктор.

Класс – это производный структурированный тип, позволяющий задать некоторую структурированную совокупность данных и определить набор операций над этими данными.

Класс в языке С++ определяется конструкцией:

ключ_класса имя_класса {список_компонентов};

где ключ_класса – одно из зарезервированных слов: class, struct, union; имя_класса – идентификатор; список_компонентов – определения и описания типизированных данных и принадлежащих классу функций.

Компонентами класса могут быть переменные, функции, классы.

Различают заголовок класса и тело класса, которое заключается в фигурные скобки.

Функции класса называют членами-функциями, компонентными функциями, методами.

Можно явно определить конструктор, который будет инициализировать объект. Основное свойство конструктора: он вызывается автоматически при создании (определении) объекта. Даже если мы явно его не определили, он все равно вызывается.

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

class first{

int a;

public:

first();

};

first::first()

{a=5;

cout<<"constructor"<<endl;

}

Void main()

{ first x,y;}

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

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

class second{

int a;

public:

second();

~second();

};

second::second()

{cout<<"создан объект"<<endl;}

second::~second()

{cout<<"разрушен объект"<<endl;}

Void main()

{second x1,x2;}

В результате выведется

создан объект

создан объект

разрушен объект

разрушен объект

Как и любая функция, конструктор может быть перегруженным, а так же иметь параметры с умалчиваемыми значениями. Таким образом, в классе можно определить несколько конструкторов, а сработает тот, который будет соответствовать фактическим параметрам при его вызове. Деструктор не может быть перегруженным, т.к. не имеет параметров. Рассмотрим пример:

class array{

inr *p,n,m;

public:

array(int N) {n=N;p=new int [n];}

array(int N,int M) {n=N; m=M; p=new int [n*m];}

~array() {delete [] p;}

};

Void main()

{array a(10);

array b(10,5);

}

18 Ооп. Поняття дружніх функціїй. Різниця між дружньою функцією - членом класу та не членом класу.

Свойство дружественности класс может предоставить для функции не являющейся членом данного класса. Дружественная функция может быть либо функцией членом другого класса, либо вообще обычной функцией.

Функция, которой класс предоставляет свойство дружественности, имеет доступ ко всем компонентам класса.

Дружественная функция объявляется в теле класса с помощью ключевого слова friend , причем поскольку она не является членом класса на нее не распространяются спецификаторы доступа( она может быть описана в любой области класса).

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

Свойства дружественных функций:

  • Друзья класса не являются членами класса. Они должны определяться вне класса, для которого они объявляются друзьями, а об особых отношениях между ними и данным классом свидетельствует лишь специальное объявление(!) со спецификатором объявления friend. Объявления дружественного класса означает, что в дружественном классе доступны все компоненты объявляемого класса.

  • Дружественные данному классу функции не являются членами этого класса. Поэтому они не могут быть вызваны из объекта-представителя класса, для которого была объявлена другом данная функция, при помощи операции доступа к члену класса.

  • Дружественная функция может быть функцией-членом другого ранее объявленного класса. Правда, при этом само определение дружественной функции приходится располагать после объявления класса, другом которого была объявлена данная функция. Это не очень удобно и красиво, но зато работает.

  • Дружественная функция не имеет this указателя для работы с классом, содержащим её объявление в качестве дружественной функции. Дружба - это всего лишь дополнение принципа инкапсуляции и ничего более.

  • Дружественные отношения не наследуются. Дружественные функции не имеют доступа к членам производного класса, чьи базовые классы содержали объявления этих функций. Дети не отвечают за отношения своих родителей.