Петров -end
Рощин -end
Рощин 25
Петров 34
Рощин - begin
Петров -begin
Петров -end
Рощин 25
Петров 34
Рощин - begin
Итак, конструктор вызывался автоматически дважды при создании объекта по имени и с помощью указателя.
Деструктор вызывался только один раз. Для объекта m2 деструктор не вызывался, т.к. мы выделили память “вручную” и так и не вернули ее системе, т.е. система не фиксирует уничтожение этого объекта при завершении программы.
Если перед getch() вставить строку
delete (m2);
то результат будет:
Причем при выводе, как первого, так и второго результата программа останавливается на вызове 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; };