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

Как же все-таки лучше всего перегружать операторы? - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Нахождение корня уравнения http://www.cyberforum.ru/cpp-beginners/thread950029.html
найти корни уравнения и отделить один из них методом деления отрезка пополам x^2=sinx
C++ как правильно создать opengl проэкт в IDE code blocks чтобы компилировался? создаю новый проект опенгл, но нифига не компилируется выдает кучу ошибок http://www.cyberforum.ru/cpp-beginners/thread950027.html
C++ Множественное наследование
Есть два класса Human(fname, lname) и класс Employee c чисто виртуальными функц (зарплата и печать). На базе этих классов нужно создать классы Boss , Worker, Stajeer. Есть файл с именами и фамилиями сотрудников, нужно считать данные обработать и создать файл имя-фамилия-должность-зарплата. Ну допустим создали vector обектов Human которых инициализировали даными из файла, а как теперь...
C++ Динамическая библиотека
В C++ я полный ноль, хочу знать как создаются библиотеки, которые подключаются в .NET как DLLImport. имеют точку входу, параметры... пример взял отсюда http://msdn.microsoft.com/ru-ru/library/ms235636(v=vs.90).aspx но там точка входа получается такая "?Add@MyMathFuncs@MathFuncs@@SANNN@Z" можно ли изменить ее на такую, какую хочу я? просто Add например.
C++ n ферзей не бьют друг друга http://www.cyberforum.ru/cpp-beginners/thread950007.html
Расставить size ферзей не бьющих друг друга на доске size*size. Вывести в глобальный массив mass. В mass поместить номер столбца(нумерация с нуля), на который нужно поставить ферзя в i-той строке. Нужно использовать рекурсию. И функцию attacking(именно в этом виде). Помогите плз только начал изучать c++ не могу разобраться. Рекурсия вообще тьма. bool attacking(int x1,int y1,int x2, int...
C++ Указатель на структуру Здравствуйте. Объявлена структура: typedef struct str { long field1; .... } str_1; подробнее

Показать сообщение отдельно
gore-lykovoe
 Аватар для gore-lykovoe
31 / 31 / 1
Регистрация: 04.04.2010
Сообщений: 414
08.09.2013, 01:31     Как же все-таки лучше всего перегружать операторы?
1. Нужно ли использовать friend там, где это возможно? (или не стоит злоупотреблять где-нибудь?)
2. Стоит ли при перегрузке бинарного оператора "+" делать его обособленным от класса?
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
// свободная ф-ия которая не friend для класса DATES
// она просто использует публичный оператор operator +=
DATES operator + (const DATES& lhs, const DATES& rhs)
{
  DATES result(lhs);
  result += rhs; // заиспользовали публичный оператор +=
  return result;
}


Оператор присваивания и копирующий конструктор обсуждать не нужно - с ними все понятно.

Интересно ваше мнение насчет перегрузок взятых из статьи на хабре:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
class Integer
{
private:
    int value;
public:
    Integer(int i): value(i) 
    {}
 
    //унарный +
    friend const Integer& operator+(const Integer& i);
 
    //унарный -
    friend const Integer operator-(const Integer& i);
 
    //префиксный инкремент
    friend const Integer& operator++(Integer& i);
 
    //постфиксный инкремент
    friend const Integer operator++(Integer& i, int);
 
    //префиксный декремент
    friend const Integer& operator--(Integer& i);
 
    //постфиксный декремент
    friend const Integer operator--(Integer& i, int);
};
 
//унарный плюс ничего не делает.
const Integer& operator+(const Integer& i) {
    return i.value;
}
 
const Integer operator-(const Integer& i) {
    return Integer(-i.value);
}
 
//префиксная версия возвращает значение после инкремента
const Integer& operator++(Integer& i) {
    i.value++;
    return i;
}
 
//постфиксная версия возвращает значение до инкремента
const Integer operator++(Integer& i, int) {
    Integer oldValue(i.value);
    i.value++;
    return oldValue;
}
 
//префиксная версия возвращает значение после декремента
const Integer& operator--(Integer& i) {
    i.value--;
    return i;
}
 
//постфиксная версия возвращает значение до декремента
const Integer operator--(Integer& i, int) {
    Integer oldValue(i.value);
    i.value--;
    return oldValue;
}
 
class Integer
{
private:
    int value;
public:
    Integer(int i): value(i) 
    {}
    friend const Integer operator+(const Integer& left, const Integer& right);
 
    friend Integer& operator+=(Integer& left, const Integer& right);
 
    friend bool operator==(const Integer& left, const Integer& right);
};
 
const Integer operator+(const Integer& left, const Integer& right) {
    return Integer(left.value + right.value);
}
 
Integer& operator+=(Integer& left, const Integer& right) {
    left.value += right.value;
    return left;
}
 
bool operator==(const Integer& left, const Integer& right) {
    return left.value == right.value;
}
 
[url]http://habrahabr.ru/post/132014/[/url]


Со всеми ли моментами вы согласны? Просто у меня много сомнений. Например, зачем использовать при перегрузке постфиксного и префиксного инкремента\декремента в аргументе объект класса. Ведь прекрасно перегружается и без него. Может стоит делать логические операторы свободными?

Вообщем хочется делать всё как лучше и искренне надеюсь, что не получится как всегда.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 11:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru