|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
КонструкторНедостатком рассмотренных ранее классов является отсутствие автоматической инициализации создаваемых объектов. Для каждого вновьсоздаваемого объекта необходимо было вызвать функцию типа set (как длякласса complex) либо явным образом присваивать значения данным объекта. Однако для инициализации объектов класса в его определение можноявно включить специальную компонентную функцию, называемую конструктором. Формат определения конструктора следующий: имя_класса(список_форм_параметров){операторы_тела_конструктора} 8 Имя этой компонентной функции по правилам языка С++ должносовпадать с именем класса. Такая функция автоматически вызывается приопределении или размещении в памяти с помощью оператора new каждогообъекта класса. Пример. сomplex(double re1 = 0.0,double im1 = 0.0){re = re1; im = im1;} Конструктор выделяет память для объекта и инициализирует данные − члены класса. Конструктор имеет ряд особенностей: • Для конструктора не определяется тип возвращаемого значения.Даже тип void не допустим •Указатель на конструктор не может быть определен, и соответственно нельзя получить адрес конструктора. •Конструкторы не наследуются. •Конструкторы не могут быть описаны с ключевыми словами virtual, static, const, mutuable, valatile. Конструктор всегда существует для любого класса, причем, если он не определен явно, он создается автоматически. По умолчанию создаетсяконструктор без параметров и конструктор копирования. Если конструктор описан явно, то конструктор по умолчанию не создается. По умолчаниюконструкторы создаются общедоступными (public).Параметром конструктора не может быть его собственный класс, номожет быть ссылка на него (T&). Без явного указания программиста конструктор всегда автоматически вызывается при определении (создании)объекта. В этом случае вызывается конструктор без параметров. Для явного вызова конструктора используются две формы: имя_класса имя_объекта (фактические_параметры); имя_класса (фактические_параметры); Первая форма допускается только при не пустом списке фактических параметров. Она предусматривает вызов конструктора при определении нового объекта данного класса: complex ss (5.9,0.15); Вторая форма вызова приводит к созданию объекта без имени: complex ss = complex (5.9,0.15); Существуют два способа инициализации данных объекта с помощью конструктора. Ранее мы рассматривали первый способ, а именно, передача значений параметров в тело конструктора. Второй способ предусматриваетприменение списка инициализаторов данного класса. Этот список помещается между списком параметров и телом конструктора. Каждый инициализатор списка относится к конкретному компоненту и имеет вид: имя_данного (выражение) Примеры. class CLASS_A { int i; float e; char c; public: CLASS_A(int ii,float ee,char cc): i(8),e(i * ee + ii),с(сс){} ... }; Класс “символьная строка”. #include <string.h> #include <iostream.h> class string { char *ch; // указатель на текстовую строку int len; // длина текстовой строки public: // конструкторы // создает объект – пустая строка string(int N = 80): len(0){ch = new char[N+1]; ch[0] = ‘\0’;} // создает объект по заданной строке string(const char *arch){len = strlen(arch); ch = new char[len+1]; strcpy(ch,arch);} // компоненты-функции // возвращает ссылку на длину строки int& len_str(void){return len;} // возвращает указатель на строку char *str(void){return ch;} ...}; Здесь у класса string два конструктора – перегружаемые функции. По умолчанию создается также конструктор копирования видаT::T(const T&), где Т – имя класса. Конструктор копирования вызывается всякий раз, когда выполняется копирование объектов, принадлежащих классу. В частности он вызывается: а) когда объект передается функции по значению; б) при построении временного объекта как возвращаемого значения функции; в) при использовании объекта для инициализации другого объекта. Если класс не содержит явным образом определенного конструктора копирования, то при возникновении одной из этих трех ситуаций производится побитовое копирование объекта. Побитовое копирование не во всех случаях является адекватным. Именно для таких случаев и необходимо определить собственный конструктор копирования. Например, в классе string: string(const string& st) {len=strlen(st.len); ch=new char[len+1]; strcpy(ch,st.ch); } Можно создавать массив объектов, однако при этом соответствующий класс должен иметь конструктор по умолчанию (без параметров). Массив объектов может инициализироваться либо автоматически конструктором по умолчанию, либо явным присваиванием значений каждому элементу массива. class demo{ int x; public: demo(){x=0;} demo(int i){x=i;} }; void main(){ class demo a[20]; //вызов конструктора без параметров(по умолча- нию) class demo b[2]={demo(10),demo(100)};//явное присваивание Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.005 сек.) |