Студенческий сайт КФУ - ex ТНУ » Учебный раздел » Учебные файлы »ПРОГРАММИРОВАНИЕ

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

Тип: реферат
Категория: ПРОГРАММИРОВАНИЕ
Скачать
Купить
Понятие перегрузки (доопределения) операций и её разновидности. Пример соответствующей программы перегрузки, понятие полиморфизма и правила isA. Использование классов операторов в программах языка С++, конструкций операторов и производных классов.
Краткое сожержание материала:

Размещено на

Размещено на

Содержание

Введение

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

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

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

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

5. Правило isA( )

Заключение

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

Введение

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

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

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

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

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

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

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

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

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

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

class String {

protected:

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

int StringSize; // Длина строки

public:

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

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

void Print( );

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

}; // "+"

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

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

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

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

String String::operator+ ( String One )

{

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

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

String Result(" ");

int Length;

// Копирование первой строки в результурующую

strcpy(Result.PointerToString, One.PointerToString);

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

// будет вызвана операция

Length = strlen( One.PointerToString );

// Добавление второй строки вслед за первой

memcpy(Result.PointerToString,PointerToString+Length,

strlen( PointerToString ) );

// Установка общей длины строки в результате

Result.StringSize = strlen( Result.PointerToString ) + 1;

Result.PointerToString[Result.StringSize] = '\0';

return (Result);

}

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

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

class A { //...

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

//...

};

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

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

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

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

/* Operations for */

/* Class */

/* String */

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

/* v.25.12.2002 */

#include "iostream.h"

#include "string.h"

class String {

protected:

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

int StringSize; // Длина строки

public:

String ( char * );

~String ( );

void Print( );

String operator+ ( String );

};

// Конструктор

String::String ( char * Str )

{

StringSize = strlen(Str);

PointerToString = new char [StringSize + 1];

strcpy ( PointerToString, Str);

}

// Деструктор

String::~String ( )

{

StringSize = 0;

delete PointerToString;

PointerToString = NULL;

}

// Переопределение операции

String String::operator+ ( String One )

{

String Result(" ");

int Length;

strcpy(Result.PointerToString, One.PointerToString);

Length = strlen( One.PointerToString );

memcpy(Result.PointerToString,PointerToString+Length,

strlen( PointerToString ) );

Result.StringSize = strlen( Result.PointerToString ) + 1;

Result.PointerToString[Result.StringSize] = '\0';

return (Result);

}

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

void String::Print( )

{

cout << PointerToString;

}

// Программа, проверяющая работоспособность операции "+"

void main( )

{

String A("111");

A.Print( );

String B("222");

B.Print( );

String C(" ");

C = A + B;

C.Print( );

}

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

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

Однако и подкласс (производный класс) может содержать функцию-метод с именем, совпадающим с уже присутствующим в базовом классе. Такой случай назвают полиморфизмом. Например, конструкции типа SubClass из нижеследующего фрагмента программы могут иметь собственные методы для печати print( ).

struct SubClass : public Base {

SubClass(char* n) : Base(n) { }

void print( ) {

cout<< "Это компонент подкласса="

<< name

<< endl;

}

};

Другие файлы:

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

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

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

Наследование и полиморфизм
Переопределение метода внутри одного класса. Сущность перегрузки унаследованного метода. Области применения абстрактного класса. Перегрузка унарных и...

Массовая коммуникация в ракурсе постмодернистского теоретизирования: информационная перегрузка