Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_ООП_ИС.doc
Скачиваний:
355
Добавлен:
09.02.2015
Размер:
611.84 Кб
Скачать

Int size; // Длина строки

public:

// Операция выделения подстроки

string operator()(int,int);

// Операция выделения символа

char operator[](int);

Int operator[](char*); // Операция поиска подстроки

};

//------ Операция выделения подстроки -------------------

string string::operator()(int n1, int n2)

{

string tmp = *this;

delete tmp.Str;

tmp.Str = new char[n2-n1+1];

strncpy(tmp.Str, Str+n1, n2-n1);

return tmp; };

Пример переопределения операции инкремента приведен выше. Переопределение декремента производится аналогично. Заметим только, что когда операции ++ и -- перегружены, префиксное использование и постфиксное в классическом С++ различить невозможно. В современной версии языка (Microsoft Visual C++ 6.0) принято соглашение, что перегрузка префиксных операций ++ и -- ничем не отличаются от перегрузки других унарных операций, то есть дружественные функции operator++() и operator--() с одним параметром некоторого класса определяют префиксные операции ++ и --. Операции - члены класса без параметров определяют те же префиксные операции. При расширении действия постфиксных операций ++ и –– операции-функции должны иметь еще один дополнительный параметр типа int. Если для перегрузки используется операция - член класса, то она должна иметь один параметр типа int. Если операция определена как дружественная функция, то ее первый параметр должен иметь тип класса, а второй - тип int. Когда в программе используется соответствующее постфиксное выражение, то операция - функция вызывается с нулевым целым параметром.

Рассмотрим пример применения разных операций - функций для постфиксной и префиксной операций ++ и --.

class pair // класс «пара чисел»

{

Int n; // целое

double x; // вещественное

friend pair& operator++(pair&); //дружественная для префикса

friend pair& operator++(pair&,int);//дружественная для постфикса

public:

pair (int n, double xn) //конструктор

{ N = n; x = xn; };

Void display () //вывод значения

{ printf (N = % d x = % f\n, N, x); };

pair& operator–– () //член для префикса

{ N /= 10; x /= 10; return *this; };

pair& operator–– ( int k) //член для постфикса

{ N /= 2; x /= 2; return *this; };

};

pair& operator++ ( pair & P) // дружественная для префикса

{ P.N *= 10; P.x *= 10; return P; };

pair& operator++ (pair & P, int k) // дружественная для постфикса

{ P.N = P.N * 2 + k; P.x = P.x * 2 + k; return P; };

Void main()

{

pair Z (10, 20.0); //вызов конструктора

Z.display(); //N = 10 x = 20

++Z; Z.display(); //N = 100 x = 200

--Z; Z.display(); //N = 10 x = 20

Z++; Z.display(); //N = 20 x = 40

Z--; Z.display(); //N = 10 x = 20

};

Для демонстрации полной независимости смысла перегруженной операции от ее традиционного значения в операциях - функциях для префиксных операций ++ соответствует увеличению в 10 раз, а –– уменьшению в 10 раз. Для постфиксных операций ++ определена как увеличение в 2 раза, а - -- уменьшение в 2 раза. Попытки использовать в постфиксных операциях значение дополнительного параметра int k подтверждают его равенство 0.

Перегрузка new, delete. Операции создания и уничтожения объектов в динамической памяти могут быть переопределены следующим образом