Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
распечатать.docx
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
160.66 Кб
Скачать

3. Конструкторы и деструкторы. Параметризованные конструкторы. Примеры.

Конструктор

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

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

Для конструкторов выполняются следующие правила:

1. для конструктора не указывается возвращаемый тип;

2. конструктор не может возвращать значение;

3. конструктор не наследуется.

Деструктор

Деструктор является дополнением конструктора. Он имеет то же имя, что и класс, но с префексом-тильдой (~). Он вызывается всякий раз, когда уничтожается представитель класса. Для деструктора существуют следующие правила:

1. деструктор не может иметь аргументов;

2. деструктор не может возвращать значения;

3. деструктор не наследуется.

Параметризованные конструкторы

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

Обычно компилятор автоматически создает конструктор копирования для каждого класса (известные как неявные конструкторы копирования), но в некоторых случаях программист создает конструктор копирования, называемый в таком случае явным конструктором копирования. В подобных случаях компилятор не создает неявные конструкторы.

имя_класса (const имя_класса &ссылка_на_объект) { //тело конструктора}

Здесь ссылка_на_объект связана с объектом, стоящим в правой части инициализации.

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

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

Параметризованные конструкторы

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

Общая форма передачи аргументов конструктору:

ярлык_класса объект(список_аргументов);

4. Дружественные ф-ции. Примеры.

Дружественные классы

Разрешить элементам другого класса полный доступ к элементам данного класса, объявленным как private или protected, можно включив в определение данного класса описание friend.

Пример.

class myclass

{

friend class another_class;

};

Дружественные функции

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

Пример.

class myclass

{

friend void another_class::member(int);

friend void func_name(float);

};

Для друзей существуют следующие правила:

1. на описания friend не влияют спецификаторы public, protected или private;

2. описания friend не взаимны: если А объявляет В другом, то это не означает, что A является другом для B;

3. дружественность не наследуется: если А объявляет В другом, классы, производные от В, не будут автоматически получать доступ к элементам А;

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

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

Пример

class line;

class box {

int color;

...

public:friend int same_color(line l, box b);

...

};

class line {

int color;

...

public:friend int same_color(line l, box b);

}; // возвращает истину, если линия и прямоугольник имеют одинаковый цвет

int same_color(line l, box b)

{

if (l.color == b.color) return 1;

return 0;}