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

Перегрузка арифметических операций

Бинарные операции могут быть перегружены так же, как и унарные операции. На прошлых занятиях мы рассматривали класс Distance, работающий с английской мерой длины. У нас была строка для сложения двух объектов и присвоения их суммы третьему объекту: dist3 = dist1.plus(dist2);.

Рассмотрим пример перегрузки операции + для получения возможности перехода к более интуитивно понятной форме записи: dist3 = dist1+dist2 .

class Distance { // класс английских мер длины

Distance operator+(Distance) const; // сложение двух длин

};

//--------------Метод для перегрузки сложения двух длин:

Distance Distance::operator+ (Distance d2) const

{ int f = feet + d2.feet; // складываем футы

float i = inches + d2.inches; // складываем дюймы

if ( i >= 12.0 ) { // если дюймов стало больше 12

i -= 12.0; // то уменьшаем дюймы на 12

f++; } // и увеличиваем футы на 1

return Distance ( f, i ); // создаем и возвращаем временную переменную

}

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

int main ( )

{

Distance dist1, dist2(11, 6.25), dist3, dist4; // определяем переменные

dist1.getdist( ); // получаем информацию

dist3 = dist1 + dist2; // складываем две переменные

dist4 = dist1 + dist2 + dist3; // складываем несколько переменных

return 0;

}

Метод для перегрузки сложения длин возвращает значение типа Distance и принимает один аргумент типа Distance. Почему принимает один аргумент?

Рассмотрим внимательно выражение: dist3 = dist1 + dist2;. Здесь важно понимать, к каким объектам будут относиться аргументы и возвращаемые значения. Возникает вопрос: Какой из объектов используется в качестве аргумента этой операции – dist1 или dist2, и не нужно ли в методе использовать два аргумента, т.к. мы складываем два значения ?

Существует правило: объект, стоящий с левой стороны операции (в нашем случае dist1), вызывает функцию оператора. Объект, стоящий справа от знака операции, должен быть передан в функцию в качестве аргумента. Таким образом, перегруженной операции всегда требуется количество аргументов на один меньшее, чем количество операндов, так как один из операндов является объектом, вызывающим функцию.

Вопрос

На основе типа char cоздайте класс Stroka, позволяющий применять к объектам типа Stroka операцию +.

int main( ) {

Stroka s1("Privet "), s2, s3;

s2.get();

s3 = s1 + s2;

cout << "\n s3 = "; s3.show();

getch(); return 0;

}

Ответ

class Stroka {

private:

enum { N=30 };

char str[N];

public:

Stroka() { strcpy(str, "\0"); }

Stroka(char* s) { strcpy(str, s); }

void get() {

cout << "\n Vvedite stroku: "; cin.getline(str, N);

}

Stroka operator+(Stroka& st2) {

Stroka temp;

if((strlen(str)+strlen(st2.str))<N) {

strcpy(temp.str, str);

strcat(temp.str, st2.str);

}

else { cout << "\nError!"; getch(); }

return temp;

}

void show() {

cout << str;

}

};