Перегрузка операций в С++

Информация - Компьютеры, программирование

Другие материалы по предмету Компьютеры, программирование

Содержание

 

Введение

. Понятие перегрузки операций

. Перегрузка различных операций

. Пpимеp программы с перегрузкой операций

. Полиморфизм

. Правило isA( )

Заключение

Список литературы

 

 

Введение

 

Тип переменной определяет набор значений, которые она может хранить, а также набор операций, которые можно выполнять над этой переменной. Например, над значением переменной типа int ваша программа может выполнять сложение, вычитание, умножение и деление. С другой стороны, использование оператора плюс для сложения двух строк лишено всякого смысла. Когда вы определяете в своей программе класс, то по существу вы определяете новый тип. А если так, C++ позволяет вам определить операции, соответствующие этому новому типу.

Перегрузка оператора состоит в изменении смысла оператора (например, оператора плюс (+), который обычно в C++ используется для сложения) при использовании его с определенным классом. В данном уроке вы определите класс string и перегрузите операторы плюс и минус. Для объектов типа string оператор плюс будет добавлять указанные символы к текущему содержимому строки. Подобным образом оператор минус будет удалять каждое вхождение указанного символа из строки.

Перегрузка операторов может упростить наиболее общие операции класса и улучшить читаемость программы.

перегрузка доопределение оператор полиморфизм

 

1. Понятие перегрузки операций

 

В С++ используется множество операций, среди которых арифметические операции ( +, *, -, / и т.п. ), логические ( >>, &, | и т.п. ), операции отношений ( ==, >, <, <= и т.п. ).

На все операции языка С++, кроме операций объявления, new, delete, и других операций, связанных с определением производных типов данных, распространяется свойство перегружаемости, т.е. возможности использования в различных случаях для одной и той же операции операндов различных типов. Так, например, операция сложения позволяет "смешивать" типы int, double, float и другие в одном выражении. Такой полиморфизм обеспечен внутренними механизмами языка С++.

В том случае, если программист определил какие-либо свои классы, он может сам решить, что будут означать операции языка С++, когда они используются над объектами этих классов, тем самым расширив число типов данных, для которых можно использовать ту или иную операцию. Переопределять или доопределять операции допускается не только для знаков операций, введенных самим программистом, но и для знаков, определенных в языке изначально (таких, как + или *).

Перегрузка смысла операций осуществляется посредством определения соответствующих функций, определяющих алгоритм выполнения операции над объектами классов. Определение этих функций полностью аналогично определению методов класса, за исключением того, что в качестве имени функции указывается строка operator@, где @ - знак переопределяемой (чаще, доопределяемой) операции.

Например, можно доопределить операцию "+" для текстовых строк как операцию конкатенации (слияния строк) следующим образом.

String {:

char *PointerToString; // Указатель на строкуStringSize; // Длина строки

public:

String ( char * ); // Конструктор

~String ( ); // Деструктор

void Print( );

String operator+ ( String ); // Перегрузка операции

}; // "+"

//----------------------------------------------------//

// Определение смысла операции "+" как //

// конкатенации текстовых строк //

//----------------------------------------------------//String::operator+ ( String One )

{

// Инициализация объекта Result

// (он будет результатом конкатенации)Result(" ");Length;

// Копирование первой строки в результурующую(Result.PointerToString, One.PointerToString);

// Установка длины строки объекта, для которого

// будет вызвана операция= strlen( One.PointerToString );

// Добавление второй строки вслед за первой(Result.PointerToString,PointerToString+Length,( PointerToString ) );

// Установка общей длины строки в результате.StringSize = strlen( Result.PointerToString ) + 1;.PointerToString[Result.StringSize] = '\0';(Result);

}

 

. Перегрузка различных операций

 

Для многих операций С++ существуют свои особенности при перегрузке (доопределении). Так унарные операции переопределяются с описанием функции операции без аргумента, например:

A { //...operator- - ( ) { // текст функции для операции - - };

//...

};

 

Соответственно доопределение бинарной операции использует описание функции операции с одним аргументом, т.к. вторым является объект, для которого вызвана операция. Следует также помнить, что операция присваивания "=" может перегружаться только объявлением метода без описателя static. То же относится к операциям "( )" и "[ ]".

 

3. Пpимеp программы с перегрузкой операций

 

Пусть необходимо запрограммировать переопределение операций для объекта "строка", где операция "+" будет означать конкатенацию строк.

 

/********************/

/* Operations for */

/* Class */

/* String */

/********************/

/* v.25.12.2002 */

#include "iostream.h"

#include "string.h"String {:*PointerToString; // Указатель на строкуStringSize; // Длина строки:( char * );

~String ( );Print( );operator+ ( String );

};

// Конструктор::String ( char * Str )

{= strlen(Str);= new char [StringSize + 1];( PointerToString, Str);

}

// Деструктор::~String ( )

{= 0;PointerToString;= NULL;

}

// Переопределение операцииString::operator+ ( String One )

{Result(" ");Length;(Result.PointerToString, One.PointerToString);= strlen( One.PointerToString );(Result.PointerToString,PointerToString+Length,( PointerToString ) );.StringSize = strlen( Result.PointerToString ) + 1;.PointerToString[Result.StringSize] = '\0';(Result);

}

// Определение функции вывода объектаString::Print( )

{<< PointerToString;

}

// Программа, проверяющая работоспо?/p>