Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
тех прог.doc
Скачиваний:
37
Добавлен:
14.11.2019
Размер:
3.59 Mб
Скачать

15.4.Конструкторы

Для инициализации объектов класса создаются специальные функции-члены – конструкторы. Имя конструктора совпадает с именем класса. Конструктор не возвращает никакого значения, даже void. Если класс имеет конструктор, то конструктор вызывается автоматически при создании объекта класса, поэтому все объекты класса будут проинициализированы.

Дополним класс дат конструкторами:

class Date{

int d, m, y; // День, месяц и год

public:

Date(int, int, int); // Конструктор с параметрами (число, месяц, год)

Date(); // Конструктор без параметров (по умолчанию)

Date(int, int); // Конструктор, день, месяц, текущий год

};

Конструкторов может быть несколько, они различаются по правилам перегруженных функций, то есть по числу и типам аргументов. С целью уменьшения числа конструкторов можно использовать аргументы по умолчанию:

class Date{

int d, m, y; // День, месяц и год

public:

Date(int = 0, int = 0, int = 0); // Данный конструктор заменяет три

};

Программа 43. Конструкторы в классе дат

Модифицируем программу 42, добавив в класс дат конструктор и функцию увеличения даты на один день.

// Файл DateCl_2.cpp

class Date{

int d, m, y; // День, месяц и год

public:

Date(int = 0, int = 0, int = 0); // Конструктор

void Add_Year(int n); // Добавить к дате n лет

void Add_Day(); // Добавить к дате 1 день

void Print();

};

#include <iostream.h>

void Date::Print()

{

cout << d << '.' << m <<'.'<< y;

}

// leap: возвращает 1, если год year високосный и 0, если нет

int leap(int year)

{

return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;

}

void Date::Add_Year(int n)

{

if(m == 2 && d == 29 && leap(y + n) != 1){

m = 3;

d = 1;

}

y += n;

}

// Массив дней в месяцах для невисокосного и високосного года

char daytab[2][13] ={{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},

{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}

};

void Date::Add_Day() // Добавить к дате 1 день

{

if(d < daytab[leap(y)][m]) // Если не последний день месяца,

d++; // увеличить номер дня

else if(m < 12){ // Если последний день месяца, но не года,

d = 1; m++; // устанавливаем первое число следующего месяца

}

else{ // Если последний день года,

d = 1; m = 1; y++; // устанавливаем 1 января следующего года

}

}

При реализации конструктора с аргументами по умолчанию воспользуемся библиотекой с заголовочным файлом dos.h, которая поддерживает, в частности, работу с датами и временем.

В файле dos.h объявлена структура:

struct date

{

int da_year; /* Year – 1980. Текущий год после 1980 */

char da_day; /* Day of the month. День месяца */

char da_mon; /* Month (1 = Jan). Месяц (1 = январь) */

};

Библиотечная функция:

void getdate(struct date *datep);

заполняет поля структуры, на которую указывает datep компонентами текущей даты.

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

// Продолжение файла DateCl_2.cpp

// Реализация конструктора

#include <dos.h>

Date::Date(int dd, int mm, int yy) // Значения аргументов по

{ // умолчанию второй раз не указываются

date sysd; // Системная дата

getdate(&sysd); // Получение системной даты

d = dd ? dd : sysd.da_day; // Если день не задан, берется текущий

m = mm ? mm : sysd.da_mon; // Если месяц не задан, берется текущий

y = yy ? yy : sysd.da_year; // Если год не задан, берется текущий

}

#include <conio.h>

int main()

{

Date Studies(1, 9, 2005);// Использование конструктора с параметрами

cout << "Исходная дата: "; Studies.Print(); cout << endl;

Studies.Add_Year(5); // Увеличение даты на 5 лет

cout << "Через 5 лет: "; Studies.Print(); cout << endl;

Date Today; // Использование конструктора по умолчанию, сегодня

cout << "Сегодня: "; Today.Print(); cout << endl;

Today.Add_Day(); // Завтра

cout << "Завтра: "; Today.Print(); cout << endl;

Date D(29, 2, 2000);

cout << "Интересная дата: "; D.Print(); cout << endl;

D.Add_Day();

cout << "Следующий день: "; D.Print(); cout << endl;

getch();

return 0;

}

Программа выдает:

Исходная дата: 1.9.2005

Через 5 лет: 1.9.2010

Сегодня: 29.3.2006

Завтра: 30.3.2006

Интересная дата: 29.2.2000

Следующий день: 1.3.2000