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

Void main () {

/* создание экземпляра класса по имени:

конструктор автоматически вызывается при создании объекта, и т.к. наш конструктор требует двух параметров, то в строке создания объекта (или в строке вызова конструктора) необходимо указать оба параметра, которые и инициируют создаваемый объектm1*/

Men m1 (“Петров” , 34 ) ;

/* создается объект, параметры конструктора инициализируют

переменную m1 (объект) */

/* Men m1 ; - уже не верно!

т.к. в классе нет конструктора без параметров, т.е. в этом

случае нельзя создать неинициализированный объект * /

/* создание экземпляра класса с помощью указателя:

параметры конструктора инициализируют динамически выделенный участок памяти под объект типа Men*/

Men * m2 = new Men ( “Рощин ”, 25 ) ;

cout<<m1. GetN ( )<< “ “ << m1. GetA( ) << endl;

cout<< m2->GetN( ) << “ “ << m2-> GetA ( ) << endl;

getch( );

}

Результат:

Петров -begin

Рощин - begin

Петров 34

Рощин 25

Петров -end

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

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

Если перед getch() вставить строку

delete (m2);

то результат будет:

Петров -begin

Рощин - begin

Петров 34

Рощин 25

Рощин -end

Петров -end

Причем при выводе, как первого, так и второго результата программа останавливается на вызове getch( ), выводятся все строки результатов, кроме последней строки, после нажатия клавиши выводится и последняя строка.

Назначение конструктора инициализировать данные, однако данные могут приобретать значения и другим способом с помощью компонентных функций SetN( ) и SetA( ).

Конструктор мог бы инициализировать только одно данное объекта и выглядеть, напр., так

Men (char*n){ name =n;}

А возраст определялся бы каким-то другим способом.

Еще примеры конструктора с параметрами:

#include <iostream.h>

struct book {

char* name ;

float price;

book (char* newn, float newpr)

{ name=newn; price=newpr;};

};

Void main()

{ book a1 ("Хождение по мукам",34.5);

cout<<a1.name;

}

#include <iostream.h>

#include <string.h>

struct goods {

char name [40];

float price;

goods (char* newn, float newpr)

{

// name=newn - ошибка (lvalue required )

strcpy(name,newn); price=newpr;};

};

Void main()

{ goods b1 ("Шляпа",12.5);

cout<<b1.name;

}

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

Заключение:

Экземпляры класса в программе могут создаваться статически и динамически.

1) Определение статического экземпляра класса:

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

Пустой список параметров не допустим, если в классе конструктор с параметрами

2) Определение массива статических экземпляров класса:

<имя класса> <имя массива> [размер массива] =

{ <имя класса>( параметры конструктора для 0-го экземпляра), …,

<имя класса> ( параметры конструктора для последнего экземпляра)

};

3) Определение динамического экземпляра класса:

<имя класса> * <имя указателя на объект> = new <имя класса> ( параметры конструктора);

4) Определение массива динамических экземпляров класса:

а)

<имя класса> * <имя массива указателей на объекты> [разм. массива] = { new <имя класса> ( параметры конструктора для 0-го экземпляра), …, new<имя класса>( параметры конструктора для последнего экземпляра) };

б)

cin>>n; // количество экземпляров

<имя класса>**<имя двойного указателя> = new <имя класса>*[n];

for( int i=0 ; i<n; i++)

<имя двойного указателя>[i] =new <имя класса> ( параметры

конструктора для i-го экземпляра);

Можно создавать безымянный объект при инициализации другого объекта

<имя класса > (фактические параметры конструктора); // нет имени

{

goods tip5 ( “Пальто” , 20000); //обычно

good tip6 = good ( “Шуба” , 100000);

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

}