Форум программистов, компьютерный форум CyberForum.ru

Перегрузка операторов - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.67
dnb_dnb
44 / 0 / 1
Регистрация: 13.11.2011
Сообщений: 95
08.01.2012, 16:11     Перегрузка операторов #1
Из всего начитанного я понял что, перегрузка операторов — это возможность назначать новый смысл операторам. Мы должны определить класс которому будет назначена перегрузка опрератора, и что нужно использовать ключевое слово operator.
Но я не могу найти нормальный синтаксис этого ключевого слова, объясните пожалуйста. Лучше всего на очень простеньком примере
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.01.2012, 16:11     Перегрузка операторов
Посмотрите здесь:

C++ [c++] Перегрузка операторов
[C++] Перегрузка операторов C++
C++ Перегрузка операторов
перегрузка операторов C++
C++ перегрузка операторов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
08.01.2012, 16:25     Перегрузка операторов #2
C++
1
2
3
struct myclass {
  bool operator() (int i,int j) { return (i<j);}
} myobject;
Стянул с cplusplus.
dnb_dnb
44 / 0 / 1
Регистрация: 13.11.2011
Сообщений: 95
08.01.2012, 16:57  [ТС]     Перегрузка операторов #3
да я видел много примернов я не могу поянть смысл. разъясни пожалуйста
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
08.01.2012, 17:03     Перегрузка операторов #4
Если вызвать myobj(5, 3) она вернет false. Если вызывать myobj(3, 5) - true(myobj - объект myclass). Я могу перегрузить другой оператор с комментариями. Только укажите какой.
В данном примере перегружаются скобки для структуры. После operator() в скобках указываются параметры, которые будут переданы.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
08.01.2012, 21:04     Перегрузка операторов #5
dnb_dnb, смысл перегрузки операторов - в более удобном синтаксисе вызова определённых методов (функций). Например, чтобы "сложить" два объекта класса, представляющего целые числа ("сложить" взято в кавычки потому, что класс, представляющий целые числа - абстракция, и в понятие "сложения" объектов этого класса можно вложить всё что угодно; я в данном случае вкладываю в это понятие тот же смысл, который вкладывается в понятие сложения чисел в реальной жизни), можно написать функцию sum, принимающую пару объектов этого класса и возвращающую объект, представляющий их сумму, т.е. так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
class Integer
{
// Реализация
};
 
Integer sum(const Integer& left, const Integer& right)
{
    // Предполагается, что класс Integer имеет конструктор, принимающий число типа int
    // и метод value, возвращающий число, представляемое конкретным объектом класса,
    // в виде переменной типа int
    return Integer(left.value() + right.value());
}
В этом случае, если a и b - объекты класса Integer, то чтобы получить сумму чисел, представляемых этими объектами, можно написать так:
C++
1
Integer c = sum(a, b);
Однако человеку куда привычнее видеть запись вида
C++
1
Integer c = a + b;
, ведь хотя класс Integer - это абстракция, она представляет вполне конкретную сущность - целое число, для которого мы знаем семантику арифметических операций. Поэтому можно вместо функции sum написать оператор сложения:
C++
1
2
3
4
Integer operator+(const Integer& left, const Integer& right)
{
    return Integer(left.value() + right.value());
}
Как видно, здесь не поменялось абсолютно ничего, кроме названия функции. sum изменилось на operator+. Для компилятора так же не поменялось ничего, потому как когда мы пишем
C++
1
Integer c = a + b;
, компилятор заменяет это на
C++
1
Integer c = operator+(a, b);
, т.е. происходит точно такой же вызов функции, как в случае с sum, с той разницей, что теперь эта функция имеет несколько необычное имя. Кстати, нам и самим никто не запрещает вызывать перегруженный оператор не в операторной, а в функциональной форме, т.е. явно писать
C++
1
Integer c = operator+(a, b);
.
Пример я привёл для случая глобальной перегрузки оператора (т.е. вне класса, не в виде метода, а в виде функции), но никто не запрещает перегрузить оператор для класса:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Integer
{
public:
    Integer(int integer = 0):
    m_integer(integer)
    {
    }
    
    int value() const
    {
        return m_integer;
    }
    
    Integer operator+(const Integer& right) const
    {
        return Integer(value() + right.value());
    }
    
private:
    int m_integer;
};
Разница в том, что для оператора, перегруженного для класса, количество параметров всегда на один меньше, чем количество реальных операндов оператора (т.е. оператор сложения будет принимать один аргумент, а оператор инкремента (преинкремента, если быть точным) вообще не будет принимать аргументов). Так происходит потому, что в метод класса всегда неявно передаётся ссылка на объект, из которого метод был вызван, и эта ссылка и будет заменять один из операндов (всегда левый для бинарных операторов и единственный для унарных).
Yandex
Объявления
08.01.2012, 21:04     Перегрузка операторов
Ответ Создать тему
Опции темы

Текущее время: 13:01. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru