Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.67
dnb_dnb
44 / 0 / 1
Регистрация: 13.11.2011
Сообщений: 95
#1

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

08.01.2012, 16:11. Просмотров 2523. Ответов 4
Метки нет (Все метки)

Из всего начитанного я понял что, перегрузка операторов — это возможность назначать новый смысл операторам. Мы должны определить класс которому будет назначена перегрузка опрератора, и что нужно использовать ключевое слово operator.
Но я не могу найти нормальный синтаксис этого ключевого слова, объясните пожалуйста. Лучше всего на очень простеньком примере
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.01.2012, 16:11
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Перегрузка операторов (C++):

Что такое "перегрузка операторов"? Каковы принципы работы перегруженных операторов и назначение указателя this - C++
Добрый день . Помогите понять принцип работы перегрузки операторов. объясните пожалуйста в зависимости от чего зависит агрумент при...

[c++] Перегрузка операторов - C++
Не работает. #include <conio.h> #include <iostream.h> #pragma argsused struct FazzyNumber { double x; double x1,x2; ...

Перегрузка операторов - C++
Помогите решить задачу на c++ мучаюсь 3 день Перегрузить операторы «==» и «!=» для строк. Оператор «==» возвращает соответственно 1,...

Перегрузка операторов - C++
Доброй ночи! Изучаю перегрузку операторов. Создал класс Дробь, где в качестве данных выступают числитель и знаменатель дроби. ...

Перегрузка операторов - C++
Осуществите перегрузку оператора “+=” так, чтобы при его использовании сумма увеличивалась на 5. Помогите, срочно.

Перегрузка операторов - C++
Пытаюсь написать такой код: char* operator+(char *s1, char *s2) { return ""; } выдаёт ошибку: http://codepad.org/KS8qU8Ml...

4
soon
2545 / 1310 / 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.
0
dnb_dnb
44 / 0 / 1
Регистрация: 13.11.2011
Сообщений: 95
08.01.2012, 16:57  [ТС] #3
да я видел много примернов я не могу поянть смысл. разъясни пожалуйста
0
soon
2545 / 1310 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
08.01.2012, 17:03 #4
Если вызвать myobj(5, 3) она вернет false. Если вызывать myobj(3, 5) - true(myobj - объект myclass). Я могу перегрузить другой оператор с комментариями. Только укажите какой.
В данном примере перегружаются скобки для структуры. После operator() в скобках указываются параметры, которые будут переданы.
0
silent_1991
Эксперт С++
5005 / 3063 / 149
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 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;
};
Разница в том, что для оператора, перегруженного для класса, количество параметров всегда на один меньше, чем количество реальных операндов оператора (т.е. оператор сложения будет принимать один аргумент, а оператор инкремента (преинкремента, если быть точным) вообще не будет принимать аргументов). Так происходит потому, что в метод класса всегда неявно передаётся ссылка на объект, из которого метод был вызван, и эта ссылка и будет заменять один из операндов (всегда левый для бинарных операторов и единственный для унарных).
2
08.01.2012, 21:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.01.2012, 21:04
Привет! Вот еще темы с ответами:

Перегрузка операторов - C++
Всем привет. Предположим, что нужно перегрузить оператор вывода &lt;&lt; для какого-то класса, определенного мной. Этот оператор должен выводить...

Перегрузка операторов - C++
Помогите, пожалуйста, решить задачу При создании собственных типов данных с помощью классов наиболее общей операцией является проверка...

Перегрузка операторов - C++
Объясните, пожалуйста, что означает, эта строка? return a != t1.a &amp;&amp; b != t1.b ? 1 : 0; что означает ? 1 : 0; ? Заранее...

Перегрузка операторов - C++
Нужно для класса комплексных чисел перегрузить операторы. Односимвольные определить как дружественные, а двусимвольные, присваивание и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru