- •Конструкторы и деструкторы
- •Формат компонентной функции-деструктора
- •Void main () {
- •Void main()
- •Void main()
- •Конструктор с аргументами, задаваемыми по умолчанию
- •Void main ()
- •Void shownumber ( void)
- •Конструктор по умолчанию
- •Конструктор копирования
- •Int GetX ( ) { return X; }
- •Int GetX ( ) { return X; }
- •Int GetY ( ) { return y; }
- •Void Print ( t obj )
- •Void main () {
- •Void main ( )
- •Void main ( )
- •Void vivod ( ) // выводит данные
- •Void main ( )
- •Имя класса ::имя компонента
- •Void main ( )
- •Тип данных(имя класса ::*имя указателя)
- •Имяобъекта.* указатель на компонент данных;
- •Имя объекта.*указатель на метод(параметры);
- •Компонентные функции
- •Initgraph( тип графического драйвера, режим адаптера , путь к драйверу)
- •Void far initgraph (int far * graphdriver, int far * graphmode, char far * pathtodriver);
- •Void point :: show (void)
- •Void point :: hide(void)
- •Void main ( )
- •Указатель this
- •Void print ( void) void print ( void)
- •Void main ()
- •Void que::add(void)
- •Void que::print (void)
- •Void main( )
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
}