АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Перегрузка операций. Понятие перегрузки операторов. Синтаксис перегрузки операции. Перегрузка бинарных операций, операций сравнения

Читайте также:
  1. I. Понятие и значение охраны труда
  2. I. Понятие общества.
  3. II. ОСНОВНОЕ ПОНЯТИЕ ИНФОРМАТИКИ – ИНФОРМАЦИЯ
  4. II. Понятие социального действования
  5. III. Проведение операций
  6. А. Понятие жилищного права
  7. А. Понятие и общая характеристика рентных договоров
  8. А. Понятие и признаки подряда
  9. А. Понятие и элементы договора возмездного оказания услуг
  10. А. Понятие и элементы комиссии
  11. А. Понятие и элементы простого товарищества
  12. А. Понятие обязательств из неосновательного обогащения и основания их возникновения

В языке C++ можно переопределить в некотором классе такие привычные операции, как +, -, * и /. Главное ограничение для перегрузки операции состоит в том, что синтаксис и приоритет операции не должны изменяться по сравнению с первоначально определенными. Другой важный момент — перегрузка операции возможна только в области действия того класса, в котором она выполняется.

Для перегрузки операции используется ключевое слово operator, за которым следует сама операция: тип operator операция (список параметров). Например: angle_value operator +(angle_argument).

Бинарные операции могут быть перегружены так же, как и унарные операции. Выделяют перегрузки арифметических операций, операций сравнения и операции присваивания.

Операции сравнения

#include <iostream>

using namespace std;

class Distance

{

private:

int feet;

float inches;

public:

// конструктор без параметров

Distance (): feet (0), inches (0.0)

{ }

// конструктор с двумя параметрами

Distance (int ft, float in): feet (ft), inches (in)

{ }

void getdist ()

{

cout << "\nВведите футы: "; cin >> feet;

cout << "Введите дюймы: "; cin >> inches;

}

void showdist ()

{ cout << feet << "\'-" << inches << '\"'; }

bool operator< (Distance) const;

};

// сравнение двух длин

bool Distance::operator< (Distance d2) const

{

float bf1 = feet + inches / 12;

float bf2 = d2.feet + d2.inches / 12;

return (bf1 < bf2)? true: false;

}

int main ()

{

Distance dist1; // определяем переменную

dist1.getdist (); // получаем длину от пользователя

Distance dist2 (6, 2.5); // определяем и инициализируем переменную

// показываем длины

cout << "\ndist1 = "; dist1.showdist ();

cout << "\ndist2 = "; dist2.showdist ();

// используем наш оператор

if (dist1 < dist2)

cout << "\ndist1 меньше чем dist2";

else

cout << "\ndist1 больше или равно чем dist2";

cout << endl;

return 0;

}

Эта программа сравнивает интервал, заданный пользователем, с интервалом 6'-2.5", определенным в программе. В зависимости от полученного результата затем выводится одно из двух предложений.

Сравнение строк

Рассмотрим другой пример перегрузки оператора, теперь это будет оператор сравнения (==). Мы будем использовать его для сравнения объектов класса String, возвращая true, если они одинаковы, и false, если они различны.

#include <iostream>

using namespace std;

#include <string.h> // для функции strcmp

class String // наш класс для строк

{

private:

enum { SZ = 80 }; // максимальный размер строки

char str [ SZ ]; // массив для строки

public:

// конструктор без параметров

String ()

{ strcpy (str, ""); }

// конструктор с одним параметром

String (char s [ ])

{ strcpy (str, s); }

// показ строки

void display () const

{ cout << str; }

// получение строки

void getdist ()

{ cin.get (str, SZ); }

// оператор сравнения

bool operator== (String ss) const

{

return (strcmp (str, ss.str) == 0)? true: false;

}

};

int main ()

{

String s1 = "да";

String s2 = "нет";

String s3;

cout << "\nВведите 'да' или 'нет': ";

s3.getdist(); // получаем строку от пользователя

if (s3 == s1) // сравниваем со строкой 'да'

cout << "Вы ввели 'да'\n";

else

if (s3 == s2) // сравниваем со строкой 'нет'

cout << "Вы ввели 'нет'\n";

else

cout << "Следуйте инструкциям!\n";

return 0;

}

В функции main() мы используем операцию == дважды: в первый раз, когда определяем, введена ли строка «да», а во второй раз — введена ли строка «нет».

Функция operator==() использует библиотечную функцию strcmp() для сравнения двух строк. Эта функция возвращает 0, если строки равны, отрицательное число, если первая строка меньше второй, и положительное число, если первая строка больше второй строки. Здесь «меньше чем» и «больше чем» использованы в их лексикографическом смысле для определения того, что стоит раньше в алфавитном списке — первая строка или вторая.

Другие операции сравнения, такие, как < и >, могут быть также использованы для сравнения лексикографического значения строк. Или, что то же самое, операторы сравнения могут быть переопределены для сравнения длины строк. Так как вы можете сами определять, для чего будет использоваться операция, то вы можете использовать любое подходящее для вашей ситуации определение.

 


1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.005 сек.)