Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Перегрузка операторов плюс и минус.

Читайте также:
  1. ГЛАВА 11 • НОВЫЙ ПОВОРОТ В ДЕЛЕ ОПЕРАТОРОВ 151
  2. ГЛАВА 3. НАЧИНАЕМ ПОНИМАТЬ ОПЕРАТОРОВ
  3. Задание 1. Перегрузка функций
  4. Лабораторная работа №7. Перегрузка операций.
  5. Ошибки операторов
  6. Перегрузка бинарных операторов
  7. Перегрузка оператора вызова функции

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

Ниже приведено определение класса, создающее класс string. Этот класс содержит один элемент данных, который представляет собой собственно символьную строку. Кроме того, этот класс содержит несколько различных методов и пока не определяет каких-либо операторов:

class string

{

public:

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

void str_append(char *);

void chr_minus(char);

void show_string(void);

private:

char data[256];

};

Как видите, класс определяет функцию str_append, которая добавляет указанные символы к содержимому строки класса. Аналогичным образом функция chr_minus - удаляет каждое вхождение указанного символа из строки класса. Следующая программа использует класс string для создания двух объектов символьных строк и манипулирования ими.

#include <iostream.h>

#include <string.h>

#include <conio.h>

class str

{

public:

str(char *);

void str_append(char *);

void chr_minus(char);

void show_string(void);

private:

char data[256];

};

str::str(char *str)

{

strcpy(data, str);

}

void str::str_append(char *str)

{

strcat(data, str);

}

void str::chr_minus(char letter)

{

char temp[256];

int i, j;

j = 0;

for (i = 0; data[i]!=0; i++){

if (data[i]!= letter){

temp[j++] = data[i]; }

temp[j] = 0;

strcpy(data, temp);

}

 

}

void str::show_string(void)

{

cout << data << endl;

}

void main(void)

 

{

str title("Hi ");

str lesson("C++ ");

title.show_string();

lesson.str_append(" and C ");

lesson.show_string();

lesson.chr_minus('C');

lesson.show_string();

getch();

}

 

При перегрузке оператора используйте ключевое слово C++ operator вместе с прототипом и определением функции, чтобы сообщить компилятору C++, что класс будет использовать этот метод как оператор. Например, следующее определение класса использует ключевое слово operator, чтобы назначить операторы плюс и минус функциям str_append и chr_minus внутри класса string:

class string

{

public:

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

void operator +(char *);

void operator -(char); //Определение операторов класса void show_string(void);

private:

char data[256];

};

Как видите, класс перегружает операторы плюс и минус. Как уже упоминалось, когда класс перегружает оператор, он должен указать функцию, которая реализует операцию, соответствующую этому оператору. В случае оператора плюс определение такой функции становится следующим:

void string::operator +(char *str)

{

strcat(data, str);

}

Как видите, определение этой функции не содержит имени, поскольку здесь определяется перегруженный оператор класса. Для перегрузки оператора плюс программа не изменила обработку, которая осуществляется внутри функции (код этой функции идентичен коду предыдущей функции str_append). Вместо этого программа просто заменила имя функции ключевым словом operator соответствующим оператором. Следующая программа иллюстрирует использование перегружаемых операторов плюс и минус:

#include <iostream.h>

#include <string.h>

#include <conio.h>

class str

{

public:

str(char *);

void operator + (char *);

void operator - (char);

void show_string(void);

private:

char data[256];

};

str::str(char *str)

{

strcpy(data, str);

}

void str::operator + (char *str)

{

strcat(data, str);

}

void str::operator -(char letter)

{

char temp[256];

int i, j;

j = 0;

for (i = 0; data[i]!=0; i++){

if (data[i]!= letter){

temp[j++] = data[i]; }

temp[j] = 0;

strcpy(data, temp);

}

 

}

void str::show_string(void)

{

cout << data << endl;

}

void main(void)

 

{

str title("C and ");

title + (" C++");

title.show_string();

title-('C');

title.show_string();

getch();

}

В данном случае синтаксис оператора законен, но немного непривычен. Обычно вы используете оператор плюс в выражении, которое возвращает результат, например, как в операторе some_str = title + "текст ";. Когда вы определяете оператор, C++ предоставляет вам полную свободу в отношении поведения оператора. Однако, как вы помните, ваша цель при перегрузке операторов состоит в том, чтобы упростить понимание ваших программ. Поэтому следующая программа немного изменяет предыдущую программу, чтобы позволить ей выполнять операции над переменными типа string, используя синтаксис, который более согласуется со стандартными операторами присваивания:

#include <iostream.h>

#include <string.h>

#include <conio.h>

class str

{

public:

str(char *);

char* operator + (char *);

char* operator - (char);

void show_string(void);

private:

char data[256];

};

str::str(char *str)

{

strcpy(data, str);

}

char* str::operator + (char *str)

{

strcat(data, str);

return data;

}

char* str::operator -(char letter)

{

char temp[256];

int i, j;

j = 0;

for (i = 0; data[i]!=0; i++){

if (data[i]!= letter){

temp[j++] = data[i]; }

temp[j] = 0;

strcpy(data, temp);

}

return data;

}

void str::show_string(void)

{

cout << data << endl;

}

void main(void)

 

{

str title("C and ");

title=title + "C++";

title.show_string();

title=title-'C';

title.show_string();

getch();

}

Изменив перегруженные операторы плюс и минус таким образом, чтобы они возвращали указатель на символьную строку, программа может теперь использовать эти операторы в привычном для оператора присваивания виде:

title=title + "C++";

title=title-'C';

 

Вывод:

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

Чтобы перегрузить оператор, необходимо определить класс, которому оператор будет назначен.

Когда перегружается оператор, перегрузка действует только для класса, в котором он определяется. Если программа использует оператор с неклассовыми переменными (например, переменными типа int или float), используется стандартное определение оператора.

Чтобы перегрузить оператор класса, используйте ключевое слово C++ operator для определения метода класса, который C++ вызывает каждый раз, когда переменная класса использует оператор.

C++ не позволяет перегружать оператор выбора элемента (.), оператор указателя на элемент (.*), оператор разрешения области видимости (::) и условный оператор сравнения (?:).


Дата добавления: 2015-11-26; просмотров: 90 | Нарушение авторских прав



mybiblioteka.su - 2015-2024 год. (0.014 сек.)