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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Метод рунге-кутта 3 порядка http://www.cyberforum.ru/cpp-beginners/thread1179025.html
дана функция d(y(x))/dx=e^x-2y(x) Нач. условия y(0)=e Код#include<stdio.h> #include<conio.h> #include<math.h> float fun(float x, float y) { return exp(x)-2*y; }
C++ Не выбирает необходимую программу. Условные операторы в меню При вводе выбора функции 2, все равно решает как первую. В чем может быть ошибка? #include "stdafx.h" #include "stdio.h" #include "math.h" #include "locale.h" int task1() { int i,n; float a,e,b,h,x,I0,I1,eps; http://www.cyberforum.ru/cpp-beginners/thread1179001.html
Функция удаления элементов (список, стек) C++
Подскажите, имеется функция добавления элементов (список, стек) Нужно на её основе сделать функцию удаления элемента. Что-то запутался, подскажите как сделать верно. Добавление: void linklist::additem(int d) // добавление элемента { link* newlink = new link; // выделяем память
Из трехзначного числа Х вычли его последнюю цифру C++
Из трехзначного числа Х вычли его последнюю цифру. Когда результат разделили на 10, а к частному слева приписали последнюю цифру числа Х, то получилось число У. По заданному числу У найти число Х (значение У вводится с клавиатуры, 100≤Y≤999). как я понимаю: х1_х2_х3 = х зачеркиваем последнюю цифру,остается х1_х2 делим на 10 х1_х2/10 = х1 приписываем конец х , т.е выходит х1_х3 = у...
C++ Как осуществить поиск по элементам множества? http://www.cyberforum.ru/cpp-beginners/thread1178958.html
Задано 70 целых чисел из диапазона от 1 до 150. Найти количество чисел, которые кратны 5 и вывести их. Как осуществить поиск по элементам множества? #include "stdafx.h" #include <iostream> #include <set> #include <iterator> #include <cstdlib> #include <ctime> using namespace std;
C++ Сравнить два вектора размерности n Как сравнить два вектора размерности n? Например вектор a(2,3,2) сравнить с вектором b(1,3,3). Какой из векторов больше? Вообще можно ли их сравнить? подробнее

Показать сообщение отдельно
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
17.05.2014, 19:40     Почему в с++ бинарные операции должны перегружаться внешними функциями?
Точнее будет сказать - не обязаны.
Сходу есть пара логических причин бинарные операторы делать внешними функциями.
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
 
Текущее время: 00:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru