Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Довизначення (overloading) операцій. Складніші варіанти присвоєння розглянемо у наступному розділі




Складніші варіанти присвоєння розглянемо у наступному розділі.

 

Унарні арифметичні операції інкременту і декременту довизначаються в дещо

умовний спосіб, що ілюструється наступним прикладом.

 

Розглянемо клас

class Time

{

private:

short hours;

short minutes;

short seconds;

//Функція службова, а тому закрита

void NormalizeTime();

public:

Time();

Time(short h, short m, short s);

void Display();

Time operator+(const Time &aTime);

Time& operator*=(short num);

Time operator++ ();

Time operator++ (int);

};

 

та його реалізацію

#include <iostream>

using namespace std;

#include "Time.h"

 

Time::Time()

{

seconds = 0;

minutes = 0;

hours = 0;

}

Time::Time(short h, short m, short s)

{

seconds = s;

minutes = m;

hours = h;

NormalizeTime();

}

void Time::NormalizeTime()

{

hours += ((minutes + (seconds/60)) / 60);

minutes = (minutes + (seconds/60)) % 60;

seconds %= 60;

}

void Time::Display()

{

cout << "(" << hours <<":" << minutes

<< ":" << seconds << ")\n";

}

Time Time::operator+(const Time &aTime)

{

short h;

short m;

short s;

 

h = hours + aTime.hours;

m = minutes + aTime.minutes;

s = seconds + aTime.seconds;

Time tempTime(h, m, s);

return tempTime;

}

 

Time& Time::operator*=(short num)

{

hours *= num;

minutes *= num;

seconds *= num;

NormalizeTime();

return *this;

}

Time Time::operator++ ()

{

//Унарна операція, тому параметру немає

this->hours += 1;

return *this;

}

Time Time::operator++ (int)

{

//Теж унарна операція

//Параметр не використовується і не визначається

//Він служить лише для того, щоб формально відрізняти

//реалізацію постфіксної операції від префіксної

Time aTime = *this;

this->hours += 1;

return aTime;

}

 

разом з тестувальною програмою

int main()

{

Time firstTime(1, 10, 50);

Time secondTime(2, 24, 20);

Time sumTime;

 

firstTime.Display();

cout<<'+'<<endl;

secondTime.Display();

 

cout << "---------\n";

 

sumTime = firstTime + secondTime;

sumTime.Display();

 

cout << "* 2\n";

cout << "---------\n";

 

sumTime *= 2;

sumTime.Display();

firstTime=sumTime++;

firstTime.Display();

sumTime.Display();

firstTime=++sumTime;

firstTime.Display();

return 0;

}

 

Продовжимо вивчення операцій, що підлягають довизначенню. Зараз мова піде

про операції, які реалізуються виключно членами класу. Реалізація утилітами

для них неможлива.

 

 

Розміщення та знищення об'єкту. Унарні операції

new та delete теж реалізуються особливо. Спочатку розглянемо приклад

 

class Blob

{

public:

void* operator new(size_t blobSize);

void operator delete(void *blobPtr,size_t blobSize);

};

 

Параметр для унарного оператора new х готується спеціально. Його обчислює

компілятор, виходячи з типу х. Оператор new повертає безтиповий указник на

виділену пам'ять. Значення параметру blobSize передвизначеного типу size_t

автоматично обчислюється компілятором. Цей параметр визначає об'єм пам'яті,

що виділятиметься. Якщо планується передавати також інші параметри, вони розташовуються

за ним.

 

void *Blob::operator new(size_t blobSize)

{

cout << "new: " << blobSize << " byte(s).\n";

return new char[ blobSize ];

}

 

Оператор delete ніколи не повертає значення. Він вимагає принаймні одного

параметру, а саме: безтипового указника на блок, що витиратиметься. Може бути

і другий параметр, який система програмування формує, виходячи з класу, в якому

довизначається оператор

delete

. Тоді маємо сигнатуру operator

delete(*void,

size_t)

. Другий параметр не обов'язковий, він буде потрібен, коли з'явиться

ієрархія класів з віртуальними деструктори (див. наступний розділ).

 

void Blob::operator delete(void *blobPtr,size_t blobSize)

{

cout << "delete: " << blobSize << " byte(s).\n";

delete [] blobPtr;

}

 

Ось приклади виклику:

 

Blob *blobPtr;

blobPtr = new Blob;

delete blobPtr;

 

Буде виділено 1 байт — стільки місця займають об'єкти без атрибутів. Поекспериментуйте

з розмірами об'єкту, додаючи в клас Blob атрибути.

 

Операція виклику функції. Спочатку

займемося створенням так званих функції-подібних об'єктів. Один з

них ми вже знаємо — це указники на функції, наприклад,

double (*f)(double)

 

, до яких також можна застосовувати операцію виклику f(a). В такий спосіб

можна довизначити операцію виклику функції власне для довільного функції-подібного

об'єкта, наприклад, товару:

 

#include <iostream.h>

//Об’єкти класу Item призначені для продажу.

//В їх ціну входить ставка ПДВ.

class Item

{

private:

double price;

public:

Item(double itemPrice);

double operator()(double vat = 0);

};

 

Item::Item(double itemPrice)

{

price = itemPrice;

}

 

double Item::operator()(double vat)

{

return(((vat *.01) + 1) * price);

}

 




Поделиться с друзьями:


Дата добавления: 2014-01-06; Просмотров: 270; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.014 сек.