
- •220300 - Системы автоматизированного проектирования
- •Тема 2. Технологии программирования
- •Тема 2. Технология разработки крупных приложений
- •Структуры
- •Структуры и функции
- •Массивы структур
- •Поиск в массиве структур
- •Вложенность структур
- •Рекурсия
- •Алгоритм быстрой сортировки
- •Массивы структур и бинарные файлы
- •Динамические структуры данных
- •Линейные списки
- •Очереди
- •Контрольная работа
- •Объектно-ориентированное программирование. Классы
- •Конструкторы
- •Перегруженные конструкторы
- •Определение методов класса вне класса
- •Объекты, возвращаемые функцией (методом)
- •Структуры и классы
- •Классы и память
- •Статические данные класса
- •Константные методы
- •Деструкторы
- •Массивы и классы
- •Массивы объектов
- •Строки Строковый тип или стандартный класс string
- •Тип строк AnsiString
- •Перегрузка операций
- •Перегрузка арифметических операций
- •Перегрузка операций сравнения
- •Перегрузка операции приведения типа
- •Преобразования объектов в основные типы и наоборот
- •Преобразование объектов классов в объекты других классов
- •Наследование
- •Конструкторы производного класса
- •Перегрузка функций
- •Иерархия классов
- •Общее и частное наследование. Комбинации доступа
- •Множественное наследование
- •Включение. Классы в классах
- •Виртуальные и дружественные функции
- •Абстрактные классы и чистые виртуальные функции
- •Виртуальные деструкторы
- •Виртуальные базовые классы или устранение неоднозначности при множественном наследовании
- •Дружественные функции
- •Дружественные классы
- •Указатель this
- •Многофайловые программы
- •Распознавание нажатых клавиш
Перегрузка арифметических операций
Бинарные операции могут быть перегружены так же, как и унарные операции. На прошлых занятиях мы рассматривали класс 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; } };
|