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

Почему в с++ бинарные операции должны перегружаться внешними функциями? - C++

Восстановить пароль Регистрация
 
reaktiv12
 Аватар для reaktiv12
3 / 3 / 2
Регистрация: 20.05.2013
Сообщений: 43
17.05.2014, 19:21     Почему в с++ бинарные операции должны перегружаться внешними функциями? #1
почему в с++ бинарные операции должны перегружаться внешними функциями?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.05.2014, 19:21     Почему в с++ бинарные операции должны перегружаться внешними функциями?
Посмотрите здесь:

C++ Операции с функциями
C++ Взаимодействие со внешними программами
C++ Почему перегруженные шаблоны функций должны возвращать один и тот же тип?
Почему не работает sqrt? Подскажите, где ошибка? Простенькая программа с тремя функциями C++
Динамический массив структур. Почему данные доступны после выполнения операции delete [] C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
17.05.2014, 19:22     Почему в с++ бинарные операции должны перегружаться внешними функциями? #2
Не должны.
reaktiv12
 Аватар для reaktiv12
3 / 3 / 2
Регистрация: 20.05.2013
Сообщений: 43
17.05.2014, 19:35  [ТС]     Почему в с++ бинарные операции должны перегружаться внешними функциями? #3
Не должны? А почему? А как же тогда объяснить это:
Миниатюры
Почему в с++ бинарные операции должны перегружаться внешними функциями?  
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
17.05.2014, 19:40     Почему в с++ бинарные операции должны перегружаться внешними функциями? #4
Точнее будет сказать - не обязаны.
Сходу есть пара логических причин бинарные операторы делать внешними функциями.
1. Допустим, у нас есть класс Integer - обертка над типом int. Пусть у него перегружен оператор+ и есть два объекта - a и b.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
class Integer {
public:
    Integer(int n = 0) : data_{n} {}
    
    Integer operator+(const Integer& rhs) const {
        return Integer{data_ + rhs.data_};
    }
    
private:
    int data_;
};
 
int main() {
    Integer a {1}, b {2};
    Integer c;
    c = a + b;
    
    return 0;
}
Тут запись a + b по сути эквивалентна a.operator+(b). Но вопрос - на каком основании a важнее b? Почему метод должен вызываться от определенного объекта? Сложение - бинарная операция, аргументы которой равноправны.

2. Вторая причина - следование принципу "выносить из класса все, что возможно".
3. Сложение обладает свойством коммутативности. Плюс, у нас есть не-explicit конструктор с одним параметром. В этом случае, если мы оставляем перегруженный оператор методом класса, у нас нарушается свойство коммутативности в случае приведения типов:
C++
1
2
c = 1 + a; // ошибка компиляции
c = a + 1; // ok
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
17.05.2014, 19:40     Почему в с++ бинарные операции должны перегружаться внешними функциями? #5
Ну так у тебя левый операнд типа int, надо так и перегрузить. Но при чём здесь вообще функции, всё равно не понятно.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
17.05.2014, 19:41     Почему в с++ бинарные операции должны перегружаться внешними функциями? #6
Upd: сначала написал, и только потом увидел пост с вырвиглазным слайдом. Так в чем вопрос тогда?
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
17.05.2014, 19:42     Почему в с++ бинарные операции должны перегружаться внешними функциями? #7
И какой такой Rational(3)? У тебя нет такой версии.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
17.05.2014, 19:43     Почему в с++ бинарные операции должны перегружаться внешними функциями? #8
Цитата Сообщение от taras atavin Посмотреть сообщение
И какой такой Rational(3)? У тебя нет такой версии.
Там конструктор с двумя параметрами, которые могут принимать значения по умолчанию. Rational(3) == Rational(3, 1).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.05.2014, 19:46     Почему в с++ бинарные операции должны перегружаться внешними функциями?
Еще ссылки по теме:

Битовые операции и операции смещения языка С C++
C++ работа с внешними ресурсами
Почему изменяется значение переменной между функциями класса? C++

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

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
17.05.2014, 19:46     Почему в с++ бинарные операции должны перегружаться внешними функциями? #9
(3, 1) и (3) - не одно и тоже, вызывается при любых дефолтах существующая версия.
Yandex
Объявления
17.05.2014, 19:46     Почему в с++ бинарные операции должны перегружаться внешними функциями?
Ответ Создать тему
Опции темы

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