Курс ООП в С презентация. ООП в с++(полный курс). Объекты и классы
Скачать 1.76 Mb.
|
КонструкторыСуществует три типа конструкторов:
конструктор с параметрами, используется для инициализации объекта требуемыми значениями; конструктор копирования, используется для создания объекта, аналогичного тому, который уже существует. конструкторы и деструкторы, создаваемые автоматически, не предполагают сколько-нибудь сложного поведения класса и оставляют реализацию особенностей поведения на усмотрение разработчика. Если подобная ситуация разработчика не устраивает, им могут быть определены свои конструкторы и деструкторы, используемые при их наличии. КонструкторыОсновные свойства конструкторов:
Класс может иметь несколько конструкторов с разными параметрами для разных видов инициализации (при этом используется механизм перегрузки). Конструктор, вызываемый без параметров, называется конструктором по умолчанию. Параметры конструктора могут иметь любой тип, кроме этого же класса. Можно задавать значения параметров по умолчанию, но их может содержать только один из конструкторов. Если программист не указал ни одного конструктора, компилятор создает его автоматически. В случае, когда класс содержит константы или ссылки, при попытке создания объекта класса будет выдана ошибка, поскольку их необходимо инициализировать конкретными значениями, а конструктор по умолчанию этого делать не умеет. Конструкторы не наследуются. Конструкторы нельзя описывать с модификаторами const, virtual и static. Конструкторы глобальных объектов вызываются до вызова функции main. Локальные объекты создаются, как только становится активной область их действия. Конструктор запускается и при создании временного объекта (например, при передаче объекта из функции). КонструкторыКонструктор вызывается, если в программе встретилась какая-либо из синтаксических конструкций: имя_класса имя_объекта [(список параметров)]; //список параметров не должен быть пустым имя класса (список параметров); //создается объект без имени, список может быть пустым имя_класса имя_объекта = выражение; //создается объект без имени и копируется Напомним, что прежде, чем использовать классы для создания их экземпляров, мы должны обеспечить видимость их описаний для самой программы: //подключаем часто используемые, но редко изменяемые файлы #include "stdafx.h" //подключаем заголовочный файл описания класса #include "person.h" КонструкторыКонструктор без параметров используется для создания "пустого" объекта. //реализация конструктора без параметров person::person() { name = new char[1]; //выделяем память под один символ name[0] = '\0'; //помещаем туда символ конца строки year = 0; //"год рождения" приравниваем к нулю } Конструктор с параметрами используется для создания объекта с определенным начальным состоянием. //реализация конструктора с параметрами person::person(char* n, int y) { name = new char[strlen(n)+1]; strcpy(name, n); year = y; } КонструкторыСуществует еще один способ инициализации полей в конструкторе – с помощью списка инициализаторов, расположенных после двоеточия между заголовком и телом конструктора. Без этого способа не обойтись при инициализации полей-констант, полей-ссылок и полей-объектов. Проиллюстрируем его на примере объекта, описывающего некоторую группу лиц и хранящего ссылку name на строку с наименованием группы, которая должна быть определена вне области видимости нашего класса group. Заметим, что такой тип атрибута как ссылка, требует обязательной инициализации. Соответственно, наличие конструктора без параметров в такой ситуации неприемлемо и будет только вызывать сообщение компилятора об ошибке. Конструкторыclass group { public: group(string& n); const string& get_name(); private: person Persons[10]; string& name; }; Инициализаторы атрибутов перечисляются через запятую. Для каждого атрибута в скобках указывается начальное значение, которое может быть выражением: group::group(string &n) : name(n) { } КонструкторыНиже представлен массив указателей на строку Names, значения которых мы определяем с помощью оператора new при создании самих строк. Далее определяется объект класса group, с которым связывается та строка, адрес которой содержит элемент Names[0], для чего вызывается соответствующий конструктор. string* Names[3]; Names[0] = new string("ASU-00-0"); Names[1] = new string("ASU-02-2"); Names[2] = new string("ASU-92-1"); group G(*Names[0]); cout << G.get_name() << endl; *Names[0] = *Names[2]; cout << G.get_name() << endl; cout << *Names[1] << endl; Names[0] = Names[1]; cout << G.get_name() << endl; |