Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лаб_С++(1-7).doc
Скачиваний:
16
Добавлен:
24.04.2019
Размер:
564.74 Кб
Скачать

Функция operator

Функция operator может быть использована для расширения области приложения следующих операторов:

+ - * / % & | и т.д.

Операции, которые не могут быть перегружены:

., .*, ::, ?:, sizeof

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

тип_возв_значения имя_класса::operator#(список аргументов)

{

действия, выполняемые применительно к классу

}

Вместо символа # ставится значок перегружаемого оператора. Оператор всегда определяется по отношению к компонентам некоторого класса. В результате его старое предназначение сохраняет силу. Функция operator является компонентом класса. При этом в случае унарной операции operator не будет иметь аргументов, а в случае бинарной операции будет иметь один аргумент. В качестве отсутствующего аргумента используется указатель this на тот объект, в котором определен оператор. Объявление и вызов функции operator осуществляется так же, как и любой другой функции. Единственное ее отличие заключается в том, что разрешается использовать сокращенную форму ее вызова. Так, выражение operator#(a,b), можно записать в сокращенной форме a#b.

Рассмотрим пример. Программа доопределяет значение оператора &. В результате его можно будет использовать для выполнения операции объединения множеств.

#include<iostream.h>

class set

{ // класс «множество»

char str[80];

public:

set(char *ss):str(ss) {} // это конструктор

char * operator&(set); // объявление функции operator

};

char * set::operator&(set S) // описание функции operator

{

int t=0, l=0;

while(str[t++]!=’\0’);

char *s1=new char[t];

for(int j=0; str[j]!=’\0’; j++)

for(int k=0; S.str[k]!=’\0’; k++)

if(str[j]==S.str[k])

{

s1[l]=str[j];

l++;

break;

}

s1[l]=’\0’;

return s1;

}

void main(void)

{

Set S1=”1f2bg5e6”, S2=”abcdef”; // задаются два множества

cout << (S1 & S2) << endl; // резудьтат fbe

cout << (set(“123”) & set(“426”)) << endl; // результат 2

}

Приведем еще пример программы перегрузки оператора “-“ для использования его при вычитании из одной строки другой.

#include<iostream.h>

#include<string.h>

class String // Описание класса String

{

char str[80];

public:

void init(char *s); // функция инициализации

int operator – (String s_new);

};

void String::init(char *s)

{

Strcpy(str,s);

}

int String::operator – (String s_new)

{

for(int i=0; str[i]==s_new.str[i]; i++)

if(!str[i]) return 0;

return(str[i]-s_new.str[i]);

}

void main(void)

{

char S1[51], S2[51];

cout << “Введите первую строку” << endl;

cin >> S1;

cout << “Введите вторую строку” << endl;

cin >> S2;

String my_string1, my_string2;

my_string1.init(S1); // инициализация объекта my_string1

my_string2.init(S2); // инициализация объекта my_string2

cout << “\n String1 – String2=”;

cout << (my_string1 - my_string2) << endl;

}

Порядок выполнения работы

  1. Изучить краткие теоретические сведения.

  2. Ознакомиться с материалами литературных источников [1,2,№,4,5].

  3. Разработать алгоритм программы.

  4. Написать, отладить и выполнить программу.

Варианты заданий

1. Реализовать класс String для работы со строками символов. Перегрузить операторы =, +=, ==, <, >, !=, <=, >=. Предоставить конструктор копирования. Определить friend функции для операций ввода-вывода в поток.

2. Реализовать класс String для работы со строками символов. Перегрузить операторы !(пуст ли String), ()(int,int) – возвращение подстроки, []. Предоставить конструктор копирования. Определить friend функции для операций ввода-вывода в поток.

3. Создать класс, в котором перегрузить операторы:

& для перемножения двух матриц;

+ для сложения двух матриц.

Память под матрицы отводить динамически. Предоставить конструктор копирования. Определить friend функции для операций ввода-вывода в поток.

4. Реализовать класс String для работы со строками символов. Перегрузить операторы =, += так, чтобы производилось сложение строки и объекта. Предоставить конструктор копирования. Определить friend функции для операций ввода-вывода в поток.

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

long double * bMoney //умножить число на деньги

long double / bMoney //делить число на деньги

Эти операции требуют наличия дружественных функций, так как справа от оператора находится объект, а слева – обычное число. Убедитесь, что main() позволяет пользователю ввести две денежные строки и число с плавающей запятой, а затем корректно выполнить все семь арифметических действий с соответствующими парами значений.

Л А Б О Р А Т О Р Н А Я Р А Б О Т А №3

Наследование и виртуальные функции

Цель работы: Изучить принципы наследования. Использовать виртуальные функции в наследуемых классах.

Краткие теоретические сведения