Второй вариант записи возможен в случае однозначности определения принадлежности функции print к классу dat.
Если имеются функции–члены с одинаковыми именами, определённые в разных классах, необходимо использовать полное (квалифицированное) имя функции–члена класса.
3. через указатель date *s;
*s = &dat1; s->print();
Пример: создать класс, реализующий сумму двух целых чисел
# include <iostream.h> class sum
{
int x,y,z;
public: void get xy (int x1, int y1); void summa (void);
};
void sum :: get xy (int x1, int y1) { x=x1; y=y1;}
void sum :: summa (void) {z= x+y;}
void main()
{
sumz;
intx2=y2;
cout<<”Введите первое слагаемое: \n”; cin>>x2;
cout<<”Введите второе слагаемое: \n”; cin>>y2;
z. get xy (x2,y2); z. summa();
}
2. КОНСТРУКТОРЫ И ДЕСТРУКТОРЫ.
Для большинства объектов естественно требовать, чтобы они были инициализированы до начала их использования. В C++ автоматическая инициализация реализуется использованием функции, называемой
конструктором. Конструктор – специальная функция, являющаяся членом класса и имеющая тоже имя, что и класс. Для конструктора не указывается тип возвращаемого значения (даже void не допустим).
Пример.
# include <iostream.h> class sum
{
int x, y, z;
public: sum (int x1; int y1); void summa (void);
};
sum:: sum (int x1=0, int y1) { x=x1; y=y1; }
void sum:: summa (void) { z= x+y; }
void main ()
{
int x2; y2;
cout<<”Введите первое слагаемое: \n”; cin>>x2;
cout<<”Введите второе слагаемое: \n”; cin>>y2;
sum.z (x2, y2); z.summa ();
}
Конструктор может иметь параметры со значением по умолчанию. Если функция конструктор требует параметр, то в момент создания объекта они должны быть обязательно переданы. Функция конструктор вызывается в момент создания объекта. Если объект локальный, то при входе в блок, если глобальный – один раз при создании объекта в начале программы. Функцию конструктор нельзя вызвать явно. Конструктор может быть перегруженной функцией, то есть один класс может иметь несколько конструкторов для разных типов или количества данных. Для передачи значений элементам данных объекта с помощью конструктора существует два формата записи:
1.имя класса_ имя объекта = имя конструктора (список аргументов): sumz = sum(5,7);
2.имя конструктора_ имя объекта (список аргумента):
sumz(5,7);
2.1. Перегруженный конструктор
Пример. class data
{
int day, month, year; public:
data (int a, int b, int c); data (void);
data (int);
………..
};
data :: data (int a, int b, int c)
{
day = a; month = b; year = c;
}
data :: data (void)
{day = 1; month = 1; year = 1989; } data :: data (int x)
{day = x; month = 3; year = 2007; } data d1 (2, 8, 2006);
data my_birthday; data today (2);
Компилятор в зависимости от количества и типов параметров сам
выбирает нужный конструктор.
2.2. Деструкторы
Деструкторы – это специальные функции-члены, которые уничтожают объекты класса и освобождают занимаемую этими объектами память; также осуществляют восстановление экрана, закрытие файла и т.д.
Деструктор имеет такое же имя, как и класс, но перед ним ставится знак тильда ~. Деструктор не должен иметь ни параметров, ни типа возвращаемого значения.
data :: ~data() {…}
Деструктор вызывается явно или не явно. Явно – при уничтожении объекта. Не явно – для локальных объектов, когда перестаёт быть активным блок, в котором данный объект объявлен.
Пример: составить программу, осуществляющую вычисление по формуле: S = a*b + c*k + a*c
# include <iostream.h> class Pro
{
int x, y, z; public:
Pro (int, int);
int put x (); int put y (); int put z (); voidproizv (void);
~Pro ();
};
Pro :: Pro (int x1, int y1) { x = x1; y = y1; }
int Pro :: put x () {return x ;} int Pro :: put y () {return y ;} int Pro :: put z () {return z ;} void Pro :: proizv () {z = x*y ;} Pro :: ~Pro () {}
void main ()
{
int S, a, b, c, k;
cout<< “\n Введите a, b, c и k \n”; cin>> a >> b >> c >> k;
Pro D = Pro (a, b); Pro E (c, k);
Pro F (a, c); D.proizv ();
S = D.put z () + E.put z () +F.put z (); cout<< “сумма = “<<S;
F. Pro :: ~ Pro ();
E. Pro :: ~ Pro ();
D. Pro :: ~ Pro ();
}
