Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Создание функции инкремента

Читайте также:
  1. III Непрерывность дифференцируемой функции
  2. III. Функции Бюро контрольных работ
  3. IV. Основные функции участников
  4. А). Создание поля для нумерации записей
  5. А. Создание и заполнение базы данных
  6. Автокорреляционная функция ЛЧМ-сигнала. Сечения функции неопределенности ЛЧМ-сигнала. Выбор класса зондирующих сигналов для РЛС.
  7. Автоматическое создание отчета на основе таблицы или запроса

С помощью перегрузки операторов можно восстановить утраченные функциональ­ные возможности класса 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 | Нарушение авторских прав



mybiblioteka.su - 2015-2024 год. (0.007 сек.)