Перегрузим операторы - добавим понятности коду

Перезагрузка операторов - однина из наиболее важных функций языка С++. Благодаря этой функции можно оприделить действия, которые будут выполняться при выполнений заданных операций с объектами.
В общем виде перегрузка оператор происходит так

тип имя_класса :: operator # {
операции
}

  • # - указывает на оператор, который будет перезагружен

Для примера создадим объект, который содержит координаты трёхмерной системы и укажем правила для операторов "+" и "=".

#include <iostream>
using namespace std;

class ThreeD {

    int x, y, z;
    public:
    ThreeD () {x=y=z=0;}
    ThreeD (int i, int j, int k) { x = i; y = j; z = k; }

/* задаём перегрузку операторов неявно */
    ThreeD operator+(ThreeD op2);
    ThreeD operator=(ThreeD op2);

/* функция для вывода значений на экран */
    void show();
}

ThreeD ThreeD::operator+(ThreeD op2){
    ThreeD temp;

/* при выполнении операции сложения с объектом складываем его соответствующи координаты */
/* под x подрозумеваются координаты объекта инициализировавшого операцию (this->x) */
    temp.x = x + op2.x;
    temp.y = y + op2.y;
    temp.z = z + op2.z;
/* возвращается результат сложения координат. Функция не модифицирует исходных значений!! */
    return temp;
}

ThreeD ThreeD::operator=(ThreeD op2){
    x = op2.x; // При выполнении операции присваивания
    y = op2.y; // целочисленных значений сохраняется
    z = op2.z; // оригинальный смысл оператора "=".
    return *this;
}

void ThreeD::show (){
    cout << x << ", ";
    cout << y << ", ";
    cout << z << "\n";
}

int main(){
    ThreeD a(1, 2, 3) , b(10, 10, 10), c;
    cout << "Исходные значения координат объекта а: ";
    a.show() ;
    cout << "Исходные значения координат объекта b: ";
    b.show();
    cout << "\n";
    c = a + b; // сложение объектов а и b
    cout << "Значения координат объекта с после с = а + b: ";
    c.show();
    cout << "\n";

    c = a + b + c; // сложение объектов а, Ь и с

    cout << "Значения координат объекта с после с = а + b + с :";
    c.show();

    cout << "\n";
    c = b = a; // демонстрация множественного присваивания
    cout << "Значения координат объекта с после с = b = а: ";
    c.show();
    cout << "Значения координат объекта b после с = b = а: ";
    b.show ();
    return 0;
}

Вывод программы такой:

Исходные значения координат объекта а: 1, 2, 3
Исходные значения координат объекта b: 10, 10, 10
Значения координат объекта с после с = а + b: 11, 12, 13
Значения координат объекта с после с = а + b + с :22, 24, 26
Значения координат объекта с после с = b = а: 1, 2, 3
Значения координат объекта b после с = b = а: 1, 2, 3

Таким образом вы видите, задав подобные правило можно существенно упростить работу по объединению/сравниванию данных нескольких объектов.

P.S. Перегружать можно любые операторы. Вот пример префиксного инкремента:

ThreeD ThreeD::operator++() {
    x++;
    y++;
    z++;
    return *this;
}

Функция увеличит все значения координат в объекте и вернёт его.

Просмотров:   1013