![]() Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву ![]() Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Перегрузка унарных операторовСодержание книги
Поиск на нашем сайте
Унарным операторам, подобным унарному плюсу и унарному минусу, необходим только один аргумент. Вы можете перегрузить эти и другие унарные операторы с помощью трюка, аналогичного проиллюстрированному в предыдущем разделе. Как и в случае с бинарными операторами, вы можете объявить функцию перегрузки унарного оператора другом или членом класса. В объявлении дружественной функции перегрузки унарного оператора необходим только один параметр, имеющий тип класса (только одно значение, над которым надо произвести действия). Например, добавьте следующее объявление в STROPS2.CPP (листинг 4.5) прямо над private: в строке 6: friend long operator-(TStrOp a); Даже несмотря на то что в строке 13 перегружен оператор вычитания, конфликтов не возникнет, поскольку в новом объявлении задан один параметр. Функция-член в строке 13 получает скрытый параметр this. #include <iostream.h> #include <stdlib.h> #include <string.h> #include <conio.h> class TStrOp { friend long operator-(TStrOp a); private: char value[12]; public: TStrOp() { value[0] = 0; } TStrOp(const char *s); long GetValue(void) { return atol(value); } long operator+(TStrOp b); long operator-(TStrOp b); }; Main() { TStrOp a = "1234"; TStrOp b = "4321"; cout << "\nValue of a == " <<a.GetValue(); cout <<"\nValue of b == " <<b.GetValue(); cout <<"\na + b + 6 == "<< (a+b+6)<<"\n"; cout <<"\na - b + 10 == " << (a-b+10)<<"\n"; cout <<"\n-a== "<< (-a)<<"\n"; getch(); return 0; } TStrOp:: TStrOp(const char *s) { strncpy(value, s, 11); value[11] = 0; } long TStrOp::operator+(TStrOp b) { return (atol(value) + atol(b.value)); } long TStrOp::operator-(TStrOp b) { return (atol(value) - atol(b.value)); } long operator-(TStrOp a){ return (-atol(a.value)); }
Новая функция, не являющаяся членом класса, не получит указателя this. Для реализации новой функции перегрузки унарного минуса, не являющейся членом класса, добавьте следующие строки после функции main(): long operator-(TStrOp a) return - atol(a.value); Поскольку унарный- оператор "минус" — друг класса, оператор return имеет непосредственный доступ к закрытому члену параметра а, имеющему тип класса TStrOp. Теперь функция закончена, и компилятор может вычислить выражения, использующие унарный минус и объекты этого типа класса. Например, добавьте следующий оператор в функцию main О (лучше всего после строки 20): cout «"\n-a == " << -а;
Скомпилируйте и запустите на выполнение модифицированную программу. Как вы видите, выражение -г заменено на операцию отрицания длинного целого представления строкового члена а. Вы научили C++ выполнять операцию отрицания над длинными целыми значениями, представленными в строковой форме!
можно объявить перегруженные унарные операторы функциями-членами. Беря за основу первоначальную копию STROPS2.CPP, добавьте следующее объявление над строкой 14 (перед закрывающей скобкой класса TStrOp): long operator-(void); #include <iostream.h> #include <stdlib.h> #include <string.h> #include <conio.h> class TStrOp { private: char value[12]; public: TStrOp() { value[0] = 0; } TStrOp(const char *s); long GetValue(void) { return atol(value); } long operator+(TStrOp b); long operator-(TStrOp b); long operator-(void); }; Main() { TStrOp a = "1234"; TStrOp b = "4321"; cout << "\nValue of a == " <<a.GetValue(); cout <<"\nValue of b == " <<b.GetValue(); cout <<"\na + b + 6 == "<< (a+b+6)<<"\n"; cout <<"\na - b + 10 == " << (a-b+10)<<"\n"; cout <<"\n-a== "<< -a<<"\n"; getch(); return 0; } TStrOp:: TStrOp(const char *s) { strncpy(value, s, 11); value[11] = 0; } long TStrOp::operator+(TStrOp b) { return (atol(value) + atol(b.value)); } long TStrOp::operator-(TStrOp b) { return (atol(value) - atol(b.value)); } long TStrOp::operator-(void){ return (-atol(value)); // аналогично -atol(this->value) } Это объявление функции-члена похоже на объявление предыдущей дружественной унарной функции. Поскольку все функции-члены получают указатель this, новая функция-член operator-() объявляется без параметров и оперирует непосредственно длинным целым эквивалентом значения this->value. Это демонстрируется в реализации функции, которую вы можете вставить после функции main(): long TStrOp::operator-(void) return -atol(value); // аналогично -atol(this->value) Перегруженная функция-член возвращает длинное целое значение value с обратным знаком. Его можно использовать в выражениях, подобных следующему, которые можно вставить в функцию main(): cout «"\п-а == " << -а; Преобразование типов можно определить свои собственные правила преобразования типов данных для автоматического преобразования объектов в другие типы. Например, предположим, что объявили и инициализировали объект класса TStrOp из STROPS2.CPP (листинг 15.5) следующим образом: TStrOp myValue = "9876"; ... Класс TStrOp запоминает строку, которая может использоваться как эквивалент длинного целого значения в операциях сложения и вычитания. можно логически попытаться присвоить объект myValue переменной длинного целого типа:
long х = myValue; //??? Конечно, этот оператор не скомпилируется, поскольку в классе TStrOp не предусмотрено преобразование строки в длинное целое значение. Решение этой проблемы заключается в использовании перегрузки операции преобразования типов для преобразования объекта класса TStrOp к другому типу данных. Операторы преобразования принимают форму оператора TYPE, где TYPE — тип данных, к которому необходимо преобразовать объект класса. Например, для задания правила преобразования типа объектов класса TStrOp в длинное целое надо вставить следующую встраиваемую функцию внутрь открытой секции класса: operator long() { return atol(value); } #include <iostream.h> #include <stdlib.h> #include <string.h> #include <conio.h> class TStrOp { private: char value[12]; public: TStrOp() { value[0] = 0; } TStrOp(const char *s); long GetValue(void) { return atol(value); } long operator+(TStrOp b); long operator-(TStrOp b); long operator-(void); //оп-ор преобразования типов operator long(){return atol(value);} }; Main() { TStrOp a = "1234"; TStrOp b = "4321"; long x=a; cout << "\nValue of a == " <<a.GetValue(); cout <<"\nValue of b == " <<b.GetValue(); cout <<"\na + b + 6 == "<< (a+b+6)<<"\n"; cout <<"\na - b + 10 == " << (a-b+10)<<"\n"; cout <<"\n-a== "<< -a<<"\n"; cout <<"\n x== "<< x<<"\n"; getch(); return 0; } TStrOp:: TStrOp(const char *s) { strncpy(value, s, 11); value[11] = 0; } long TStrOp::operator+(TStrOp b) { return (atol(value) + atol(b.value)); } long TStrOp::operator-(TStrOp b) { return (atol(value) - atol(b.value)); } long TStrOp::operator-(void){ return (-atol(value)); } Подобное использование оператора ключевого слова специально обеспечивается в C++ для создания новых правил преобразования типов. С новым правилом появилась возможность присвоить объект типа TStrOp переменной длинного целого типа, передав объект TStrOp в качестве параметра функции, возвращающей длинное целое, и т.д. Оператор индексирования массива можно перегрузить оператор индексирования массива [] для реализации доступа к данным-членам класса, подобного доступу к элементам массива, даже если эти данные имеют вид отдельных членов или списка. пример (листинг 4.6) демонстрируется перегрузка оператора [] для класса, запоминающего четыре целочисленных значения в виде отдельных данных-членов. #include <iostream.h> #include <conio.h> class PArr{ private: int v0; int v1; int v2; int v3; public: PArr(int vl0, int vl1,int vl2, int vl3) { v0 = vl0; v1 = vl1;v2 = vl2; v3 = vl3;}; int GetInt(unsigned i); int operator[](unsigned i); }; Main() { clrscr(); PArr pa(10, 20, 30, 40); for (int i=0; i <= 3;i++) cout<< "pa[" <<i <<"] == "<<pa[i] <<"\n"; getch(); return 0; } Int PArr::GetInt(unsigned i) { switch (i) {
|
||||||
Последнее изменение этой страницы: 2016-08-01; просмотров: 366; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.219.152.33 (0.01 с.) |