Читайте также:
|
|
С помощью перегрузки операторов можно восстановить утраченные функциональные возможности класса Counter. При реализации для класса оператора считается, что оператор перегружен. Компилятор интерпретирует вызов преинкрементного оператора (++i) как обращение к реализации метода operator++ (), который увеличивает переменную-член itsVal, а затем обращается к указателю this, чтобы вернуть текущий объект.
При перегрузке оператора постфиксного инкремента перед компилятором встаёт проблема: как различить операторы постфиксного и префиксного инкремента? По соглашению, в объявлении оператора постфиксного инкремента используется целочисленный тип. Значение параметра неважно, поскольку это лишь символ того, что речь идет об операторе постфиксного инкремента.
Задания 7. Перегрузка преинкрементного и посинкрементногот операторов (++i, i++)
#include <vcl.h>
#include <iostream>
#include <conio.h>
class Counter{
public:
Counter ();
~Counter () {}
int GetItsVal () const { return itsVal; }
void SetItsVal (int x) {itsVal = x;}
void Increment(){++itsVal;}
const Counter& operator++(); // перегрузка префикса
const Counter operator++(int); // перегрузка постфикса
private:
int itsVal;
};
Counter:: Counter()
{ itsVal=0;
}
const Counter& Counter::operator++() //префикс
{++itsVal;
return *this;
}
const Counter Counter::operator++(int) //постфикс
{
Counter temp(*this);
++itsVal;
return temp;
}
int main()
{Counter i;
std::cout << "initialisation i=" <<i. GetItsVal () << std::endl;
i++;
std::cout << "i++ i=" <<i. GetItsVal () << std::endl;
++i;
std::cout << "++i i=" <<i. GetItsVal () << std::endl;
Counter a = ++i;
std::cout << "a=++i a=" <<a. GetItsVal ();
std::cout << " i=" <<i. GetItsVal () << std::endl;
a = i++;
std::cout << "a=i++ a=" <<a. GetItsVal ();
std::cout << " i=" <<i. GetItsVal () << std::endl;getch();
return 0;
}
Перегрузка оператора суммы operator+
Инкремент считается унарным оператором, т. е. работает только с одним объектом. Оператор суммы это парный оператор, работающий с двумя объектами. Создадим в задании функцию Add, в которой объект Counter будет аргументом и хотя функция суммы Add вполне работоспособна, но перегрузка оператора суммы делает работу класса Counter более естественной
Задание 8. Перегрузка оператора суммы
# include <vcl.h>
# include <iostream.h>
#include <conio.h>
using namespace std;
class Counter
{public:
Counter();
Counter(int initialValue);
~Counter(){}
int GetItsVal() const {return itsVal;}
void SetItsVal(int x){itsVal=x;}
Counter Add(const Counter &);
Counter operator+ (const Counter &);
private:
int itsVal;
};
Counter::Counter(int initialValue):
itsVal(initialValue)
{}
Counter::Counter():
itsVal(0)
{}
Counter Counter::Add(const Counter & rhs)
{
return Counter (itsVal + rhs.GetItsVal());
}
Counter Counter::operator+ (const Counter & rhs)
{
return Counter(itsVal + rhs.GetItsVal());
};
int main(int argc, char* argv[])
{
Counter varOne(2), varTwo(4), varThree;
varThree = varOne.Add(varTwo);
cout << "varOne = " << varOne.GetItsVal() << endl;
cout << "varTwo = " << varTwo.GetItsVal() << endl;
cout << "varThree = " << varThree.GetItsVal() << endl;
varThree = varOne + varTwo;
cout << "(overload) varThree = " << varThree.GetItsVal() << endl;
getch();
return 0;
}
Дата добавления: 2015-11-26; просмотров: 72 | Нарушение авторских прав