Мои Конспекты
Главная | Обратная связь


Автомобили
Астрономия
Биология
География
Дом и сад
Другие языки
Другое
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Металлургия
Механика
Образование
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Туризм
Физика
Философия
Финансы
Химия
Черчение
Экология
Экономика
Электроника

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



T ( список параметров) ;

} ;

T::T( список параметров) { тело конструктора}

 

6) Как правило, конструкторы объявляются в открытой части класса

7) Конструктор может отсутствовать, при создании экземпляров класса

компилятор автоматически выделяет под них память, хотя в этом случае

данные не инициализируются, и будут содержать мусор.

8) В определении класса могут присутствовать несколько конструкторов.

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

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

 

Назначение – выполнение завершающих действий (напр., закрытие файлов, установка видеосистемы в исходное состояние, написание каких-либо фраз и т.д.)

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

 

Класс может иметь несколько конструкторов, но деструктор может быть только один.

Формат компонентной функции-деструктора

~ имя класса ( ) { операторы тела деструктора};

 

1) Между тильдой и именем класса нет пробелов.

2) У деструктора нет типа результата даже voidи нет параметров даже типа void.

3) Деструктор выполняется неявно, автоматически, как только объект уничтожается. Его, как правило, никогда не вызывают, но можно и вызывать явно, если он определен в классе

<имя объекта>. ~ <имя класса> ( );

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

 

Рассмотрим класс Men, несущий в себе данные о возрасте и имени индивидуума.

Пусть в этом классе присутствуют и конструктор и деструктор.

В конструкторе кроме инициализирующих действий имеется еще вывод контрольной строки.

Деструктор пусть также содержит вывод другой контрольной строки.

 

class Men {

char* name ;

int age;

public:

Men(char * n, int a) //встроенный конструктор

{ name = n; age = a;

cout<<name << “ - begin “<<endl;

}

void SetN (char*n) {name =n ; } // комп. функция для изменения данного

void SetA (int a) { age = a ;} // комп. функция для изменения другого данного

char* GetN ( ) { return name; } //компонентные функции

int GetA { return age; } //возвращающие значения данных

~Men ( ) { cout<< name<< “- end”<<endl;} // деструктор

#include <iostream.h>

#include<conio.h>

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

}

Конструктор с аргументами, задаваемыми по умолчанию

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

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

Для класса Menконструктор с умалчиваемыми значениями параметров:

Men (char*n = “ ”, int a =0)

// значения по умолчанию имя – пробел, возраст -0

{name=n; age = a; }

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

Вызов того же конструктора с параметрами будет инициировать данные создаваемого объекта значениями параметров */

void main ()

{ Men m1;// name = “ “ , age =0

Men m2 ( “ Иванов”, 45) //name =”Иванов”, age = 45

Men m3 (“Петров”)// name= “Петров” age=0

Men m4 (18) // ошибка!

Нельзя задавать параметр, перескакивая через умалчиваемое значение (это значение компилятором будет трактоваться как значение параметра n, и естественно будет сообщение об ошибке, т.к. это не строка).

 

Напр., если четыре параметра с умалчиваемыми значениями, можно вызывать конструктор:

1) без параметров;

2) с указанием только первого параметра ( три параметра – значения по умолчанию);

3) с указанием двух первых параметров ( два последних – по умолчанию)

4) с указанием трех первых ( последний – по умолчанию)

5) с указанием четырех параметров

Еще пример:

… struct mag

{ int a,b, c ;

mag ( int aa=1, int bb=2 , int cc=3) // конструктор

//с умалчиваемыми значениями параметров

{ a= aa; b=bb; c= cc; };




Поиск по сайту:







©2015-2020 mykonspekts.ru Все права принадлежат авторам размещенных материалов.