#include
using namespace std;
2 :
class Date
{
private:
int Day, Month, Year;
public:
// Конструктор, инициализирующий объект днем, месяцем и годом
Date (int InputDay, int InputMonth, int InputYear)
: Day (InputDay), Month (InputMonth), Year (InputYear) {};
14: bool operator== (const Dates compareTo)
{
return ((Day == compareTo.Day)
SS (Month == compareTo.Month)
SS (Year == compareTo.Year));
}
2 0 :
|
bool operator!= (const Dates compareTo)
|
21:
|
2 2 :
|
{
|
return !(this->operator==(compareTo));
}
25:
26: void DisplayDate ()
{
cout « Day « " / " « Month
}
};
31:
int main ()
{
Date Holidayl (25, 12, 2011);
Date Holiday2 (31, 12, 2011);
cout « "Holiday 1 is: ";
Holidayl.DisplayDate();
cout « "Holiday 2 is: ";
Holiday2.DisplayDate();
if (Holidayl == Holiday2)
cout « "Equality operator: The two are on
endl;
else
cout « "Equality operator: The two are on
endl;
46:
if (Holidayl != Holiday2)
. cout « "Inequality operator: The two are <
endl;
else
cout « "Inequality operator: The two are <
endl;
51:
return 0;
}
Результат
Holiday 1 is: 25 / 12 / 2011
Holiday 2 is: 31 / 12 / 2011
Equality operator: The two are on different days
Inequality operator: The two are on different days
Анализ
Оператор равенства (==) является простой реализацией, которая возвращ ает исти ну, если день, месяц и год равны, как показано в строках 14-19. Оператор неравенства (! =) — это просто повторное использование кода оператора равенства, как представлено в строке 23. Присутствие этих операторов позволяет сравнить два объекта ( H o lid a y l и H o lid a y 2 ) класса D ate в функции m ain () (строки 42 и 47).
320 ЗАНЯТИЕ 12. Типы операторов и их перегрузка
Перегрузка операторов <, >, <= и >=
Код листинга 12.7 сделал класс D ate достаточно интеллектуальным, чтобы быть в со стоянии сказать, равны ли два объекта класса D a te или нет. Но что если пользователю класса нужно выполнить такую проверку условия, как эта:
if (Datel < Date2) {// Сделать нечто}
или эта:
if (Datel <= Date2) {// Сделать нечто}
или эта:
if (Datel > Date2) {// Сделать нечто}
или эта:
if (greatDay >= Date2) {// Сделать нечто}
Пользователь календарного класса определенно нашел бы очень полезным, если бы мог просто сравнить две даты, чтобы узнать, предшествует ли этот день настоящему или следует за ним. Разработчик класса должен реализовать эти операторы сравнения, чтобы сделать использование своего класса столь же дружественным к пользователю и интуи тивно понятным, насколько возможно, как демонстрирует код листинга 12.8.
ЛИСТИНГ 12.8. Реализация операторов «=, > и >=___________________________________
#include
using namespace std;
2 :
class Date
{
private:
int Day, Month, Year;
public:
// Конструктор, инициализирующий объект днем, месяцем и годом
Date (int InputDay, int InputMonth, int InputYear)
: Day (InputDay), Month (InputMonth), Year (InputYear) {};
bool operator== (const Dates compareTo)
{
return ((Day == compareTo.Day)
&& (Month == compareTo.Month)
&& (Year == compareTo.Year));
}
2 0 :
bool operator< (const Dates compareTo)
22: {
if (Year < compareTo.Year)
return true;
else if (Month < compareTo.Month)
return true;
else if (Day < compareTo.Day)
:в return true,*'
: э else
return false;
}
22
23 bool operator<= (const Dates compareTo)
{
if (this->operator== (compareTo))
26
|
return
|
true;
|
37
|
else
|
this->operator< (compareTo);
|
28
|
return
|
}
bool operator > (const Dates compareTo)
{
return !(this->operator<= (compareTo));
}
45
bool operator>= (const Dates compareTo)
{
if(this->operator== (compareTo))
return true;
else
return this->operator> (compareTo);
}
53
bool operator!= (const Dates compareTo)
{
return !(this->operator==(compareTo));
}
58
void DisplayDate ()
{
61 cout « Day « " / " « Month « " / " « Year « endl;
}
int main()
{
Date Holidayl (25, 12, 2011);
Date Holiday2 (31, 12, 2011);
cout « "Holiday 1 is: ";
Holidayl.DisplayDate();
cout « "Holiday 2 is: ";
Holiday2.DisplayDate();
if (Holidayl < Holiday2)
cout « "operatorC Holidayl happens first" « endl;
if (Holiday2 > Holidayl)
cout « "operator>: Holiday2 happens later" « endl;
if (Holidayl <= Holiday2)1
11 3ak. 3626
322 ЗАНЯТИЕ 12. Типы операторов и их перегрузка
82: cout « "operator<=: Holidayl happens on or before Holiday2"
endl;
83:
if (Holiday2 >= Holidayl)
cout « "operator>=: Holiday2 happens on or after Holidayl"
endl^-
eS:
return 0;
88: }
Результат
Holiday 1 is: 25 / 12 / 2011
Holiday 2 is: 31 / 12 / 2011
operatorc Holidayl happens first
operator>: Holiday2 happens later
operator<=: Holidayl happens on or before Holiday2
operator>=: Holiday2 happens on or after Holidayl
Анализ
Представляющие интерес операторы реализованы в строках 21-52 и частично повтор но используют оператор == из листинга 12.7. Обратите внимание, как эти операторы были реализованы: в основном за счет повторного использования одного или другого.
Применение этих операторов в строках 75 -84 функции m ain () демонстрирует, на сколько реализация этих операторов делает использование класса D ate простым и интуи тивно понятным.
Перегрузка оператора присвоения копии (=)
Нередко содержимое экземпляра класса необходимо присвоить другому экземпляру так:
Date Holiday(25, 12, 2011);
Date AnotherHoliday(1, 1, 2010);
AnotherHoliday = Holiday; // использование оператора присвоения копий
Это приведет к вызову стандартного оператора присвоения копий, который компилятор встроит в ваш класс, если вы не предоставите таковой. В зависимости от характера ваше го класса стандартный конструктор копий может оказаться неадекватным, особенно если ваш класс задействует ресурс, который не будет скопирован. Чтобы гарантировать более глубокое копирование, как с конструктором копий, необходимо определить собственный оператор присвоения копий:
Do'stlaringiz bilan baham: |