Скачиваний:
316
Добавлен:
28.03.2021
Размер:
378.53 Кб
Скачать

14. Инициализация и разрушение объекта. Способы доступа к содержимому класса. Поля и методы класса

Объект объявляется следующим образом:

имя_класса имя_объекта;

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

Деструктор — это функция, которая вызывается при разрушении объекта.

Во многих случаях при разрушении объекту необходимо выполнить некоторое действие или даже некоторую последовательность действий. Локальные объекты создаются при входе в блок, в котором они определены, и разрушаются при выходе из него. Глобальные объекты разрушаются при завершении программы. Имя деструктора совпадает с именем конструктора, но предваряется символом "~" Подобно конструкторам деструкторы не возвращают значений, а следовательно, в их объявлениях отсутствует тип возвращаемого значения.

Доступ к элементам или полям класса можно осуществить тремя способами:

- имя представителя класса.имя элемента;

- имя класса: :имя элемента;

- указатель на представитель класса->имя элемента.

(из методички Шилдта) В классе данные объявляются в виде переменных, а код оформляется в виде функций. Функции и переменные, составляющие класс, называются его членами. Таким образом, переменная, объявленная в классе, называется членом данных, а функция, объявленная в классе, называется функцией-членом.

(из методички с лабораторными) Данные, объявленные внутри класса, называются компонентами-данными, а функциикомпонентами-функциями или методами.

15. Конструкторы и деструкторы класса. Конструктор по умолчанию

Конструктор — это специальная функция, которая является членом класса и имя которой совпадает с именем класса.

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

Деструктор — это функция, которая вызывается при разрушении объекта.

Дополнением к конструктору служит деструктор. Во многих случаях при разрушении объекту необходимо выполнить некоторое действие или даже некоторую последовательность действий. Локальные объекты создаются при входе в блок, в котором они определены, и разрушаются при выходе из него. Глобальные объекты разрушаются при завершении программы. Имя деструктора совпадает с именем конструктора, но предваряется символом "~" Подобно конструкторам деструкторы не возвращают значений, а следовательно, в их объявлениях отсутствует тип возвращаемого значения.

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

16. Конструктор копирования. Конструктор explicit. Параметризованные конструкторы. Перегрузка конструкторов класса.

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

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

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

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

Ключевое слово explicit используется для создания «неконвертирующих (явных) конструкторов» (nonconverting constractors). Например, рассмотрим следующий класс:

class MyClass{ int i; public: MyClass(int j) { i = j; } // ...};

Объекты этого класса могут быть объявлены следующим образом: MyClass ob1(1); MyClass ob2 = 10; В данном случае инструкция MyClass ob2 = 10; автоматически конвертируется в следующую форму: MyClass ob2(10);

Однако, если объявить конструктор MyClass с ключевым словом explicit, это автоматическое кон­вертирование не будет выполняться. Ниже объявление класса MyClass показано с использованием ключевого слова explicit при объявлении конструктора:

class MyClass { int i; public: explicit MyClass(int j) {i = j; } // ...};

Теперь допустимыми являются только конструкции следующего вида: MyClass ob (110); Если по-простому, explicit нужен для того, чтобы решать проблемы с неявными конвертациями.

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

Общая форма для передачи аргументов конструктору имеет следующий вид: тип_класса объект(список_аргументов); Здесь список_аргументов представляет собой список аргументов, разделенных запятыми. Эти аргументы и передаются конструктору. Для передачи аргумента конструктору необходимо задать его значение при объявлении объек­та. С++ поддерживает два способа решения этой задачи.

Первый из них выглядит следующим образом: queue а = queue(101); Здесь конструктор класса queue вызывается непосредственно с передачей ему значения 101. Значением переменной а служит сам созданный объект. Второй способ короче и более непосредственно ведет к цели. В этом методе аргумент или аргу­менты следуют непосредственно за именем объекта в скобках. Следующая строка кода служит той же самой цели, что и предыдущее объявление объекта: queue а(101)