Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Перегрузка функций и операций.doc
Скачиваний:
6
Добавлен:
01.05.2025
Размер:
143.87 Кб
Скачать

Void main ( )

{

Complex c1 (1, 2) ; // создание объекта c1

Complex c2 (3, 4) ; // создание объекта c2

Complex c3 = - c2 ; // копирование в c3 результата вызова c2.operator-( ); Complex c4 =c2-c1; // копирование в c4 результата вызова c2.operator- ( с1 );

Complex c5= c2+c1// копирование в c5 результата вызова operator+( с2,с1 );

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

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

Дело в том, что компилятор автоматически выполняет преобразование типа для аргументов функций, но не для объекта, для которого вызывается функция-член.

Если функция-оператор (другое название операции - функции) реализуется как друг и получает оба аргумента как параметры функции, то компилятор выполняет автоматическое преобразование типов двух аргументов операции.

Пример :

1. #include<string.h>

#include <iostream.h>

class stroka

{ char*ch; // указатель на строку на символьный массив

int len ; // длина строки

public:

stroka( char*cch) // конструктор1

{ len = strlen(cch) ; ch=new char [len+1]; strcpy (ch,cch); }

stroka(int N=20) // конструктор 2

{ ch = new char[N+1]; len=0; ch[0]='\0' ;}

int len_str(void) { return len;} // возвращает длину строки

char * string (void) {return ch;} // возвращает указатель на строку

void vivod ( ) // выводит данные

{ cout<< "строка: " <<ch <<" , длина строки="<<len;};

~stroka( ) // деструктор

{ delete [ ]ch ; }

stroka& operator+ (stroka& ); //прототип функции-оператора - метод

} ;

stroka& stroka::operator+ (stroka&A)

{ int N = len+ A.len_str();

stroka*ptr=new stroka(N); // создаем динамический объект

// выделяем память на суммарную строку

strcpy( ptr->string() , ch ) ; // копируем в новую строку первую строку

strcat (ptr->string() , A.string () ) ; // присоединяем к ней и вторую строку

return *ptr ; // возвращаем объект, а не указатель на объект

}

Void main ( )

{

stroka X ("Миру -"); // объявлена три объекта

stroka Y(" мир!");

stroka Z;

Z=X+Y ; // эквивалентно Z =X.operator + (Y);

Z.vivod( ) ;

(X+Y).vivod();

}

2. #include<string.h>

#include <iostream.h>

class stroka {

char*ch; // указатель на строку на символьный массив

int len ; // длина строки

public:

stroka( char*cch) // конструктор1

{ len = strlen(cch) ; ch=new char [len+1];

strcpy (ch,cch); }

stroka(int N=20) // конструктор 2

{ ch = new char[N+1];

len=0;

ch[0]='\0' ;}

int len_str(void) { return len;} // возвращает длину строки

char * string (void) {return ch;} // возвращает указатель на строку