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

operator - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.86
BTR
 Аватар для BTR
8 / 8 / 1
Регистрация: 01.11.2010
Сообщений: 157
24.01.2011, 22:20     operator #1
Всем привет, опять непонятка в книге, дошел до оператора operator и ничего не понял, для чего он нужен, что он делает, то есть как он перегружает символы и как им пользоваться, привидите пожалуйста пример, заранее благодарен!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.01.2011, 22:20     operator
Посмотрите здесь:

C++ operator=
C++ operator[]
C++ operator <<
operator char() или operator int() C++
operator() C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
28.01.2011, 08:27     operator
  #21

Не по теме:

taras atavin, я сказал своё мнение, что они дают. Я когда писал класс больших чисел, мне необходимо было при арифметических операциях "метаться" от одного операнда к другому (тут надо смотреть длину левого числа, тут пройтись в цикле по правому, тут опять вернуться к левому и т.д.), и если у меня нет перед глазами двух чётких операндов с двумя чёткими именами - left и right, а есть один rhs и нечёткий *this, мне было легче запутаться. Поэтому френды мне больше по душе при реализации бинарных операций.
А про "запутаться при наследовании" - если нормально структурируешь код - не запутаешься. И комменты тоже не просто так придумали.

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
28.01.2011, 08:36     operator #22
Что нечёткого?
C++
1
this->
вместо
C++
1
left.
для обращения к любому его члену. Можно даже сделать локальную ссылку
C++
1
A &left=*this;
.

Добавлено через 4 минуты
Но если у тебя левый операнд имеет иной тип, то придётся френдом, а если при этом и тот тип тоже класс, то придётся объявить один оператор френдом сразу двух классов. Если же и правый операнд тоже объект какого то третьего класса, то нужен уже тройной френд.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
28.01.2011, 09:03     operator #23
taras atavin, да Господи, просто мне, лично мне так не удобно. Пример для ТСа писал я, и я написал так, как удобнее лично мне. Я же никого не призываю писать так и никак иначе.

Не по теме:

Зато этот спор будет полезен ТСу, он глянет и решит для себя, как ему удобнее. Я же, как и всегда, остаюсь при своём мнении, как, думаю, и вы)))

CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
28.01.2011, 09:31     operator #24
Цитата Сообщение от taras atavin Посмотреть сообщение
Нельзя обычными глобальными функциями. А френдами можно, но в данном случае не нужно. Что они в данном конкретном случае дают про сравнению с членами?
taras atavin, лучший вариант - использовать свободные функции (что видимо и подразумевает ForEveR).
Простой пример:
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
class Foo {
public:
  Foo(int value) {
     // ...
  }
 
  const Foo operator+(const Foo& rhs) const {
    // ...
  }
 
  // ...
};
 
class Bar {
public:
  Bar(int value) {
    // ...
  }
  
  // ...
};
 
const Bar operator+(const Bar& lhs, const Bar& rhs) {
  // ...
}
 
int main() {
  Foo foo1(1);
 
  Foo foo2 = foo1 + 2; // OK
  Foo foo3 = 2 + foo1; // Ошибка
 
  Bar bar1(1);
 
  Bar bar2 = bar1 + 2; // OK
  Bar bar3 = 2 + bar1; // ОК
}

Не по теме:

ForEveR, сеттеры и геттеры к инкапсуляции имеют очень слабое отношение.

taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
28.01.2011, 09:42     operator #25
Обычные члены, ничего особенного. А что такое "свободные функции"?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
28.01.2011, 09:44     operator #26
taras atavin, у класса Bar operator+ - не член.

CyBOSSeR, в чём причина возвращать константный объект?))

Не по теме:

а ведь френдами того же самого можно было добиться)))

taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
28.01.2011, 09:49     operator #27
Далеко не все классы могут не иметь protected и private членов, а операторам могут потребоваться любые существующие члены.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
28.01.2011, 10:13     operator #28
Цитата Сообщение от silent_1991 Посмотреть сообщение
CyBOSSeR, в чём причина возвращать константный объект?
Имитация поведения встроенных типов:
C++
1
2
3
4
int a = 1;
int b = 2; 
 
(b + a) = 2; // Ошибка
Если бы оператор возвращал неконстантный объект можно было бы сделать:
C++
1
2
3
Foo f1(1), f2(2);
 
(f1 + f2) = Foo(3);
Цитата Сообщение от silent_1991 Посмотреть сообщение
а ведь френдами того же самого можно было добиться
Приведи пример.

Цитата Сообщение от taras atavin Посмотреть сообщение
Далеко не все классы могут не иметь protected и private членов, а операторам могут потребоваться любые существующие члены
И?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
28.01.2011, 10:24     operator #29
CyBOSSeR, да, с конст тупанул, мне почему-то взбрело, что и без него всё будет прекрасно... Вы правы.
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Приведи пример.
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
#include <iostream>
 
class Foo
{
public:
    Foo(int = 0);
 
    friend const Foo operator+(const Foo &, const Foo &);
 
    friend std::ostream &operator<<(std::ostream &, const Foo &);
 
private:
    int _a;
};
 
Foo::Foo(int a):
_a(a)
{
}
 
const Foo operator+(const Foo &lhs, const Foo &rhs)
{
    return Foo (lhs._a + rhs._a);
}
 
std::ostream &operator<<(std::ostream &output, const Foo &rhs)
{
    return output << rhs._a;
}
 
int main()
{
    Foo a1(10), a2, a3;
 
    a2 = a1 + 2;
    a3 = 5 + a1;
 
    std::cout << a2 << std::endl << a3 << std::endl;
 
    return 0;
}
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
28.01.2011, 10:26     operator #30
Что "и"? Если класс имеет protected, а оператору нужен именно этот член, то попробуй ка сделать именно так.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
28.01.2011, 11:39     operator #31
silent_1991, а... Я не правильно понял твою фразу . Все Ок.

Цитата Сообщение от taras atavin Посмотреть сообщение
Если класс имеет protected, а оператору нужен именно этот член, то попробуй ка сделать именно так.
Во-первых, все зависит от ситуации, во-вторых, есть дружественные функции.
Общее правило: если есть выбор между свободной функцией не другом и функцией членом, выбор лучше сделать в сторону свободной функции.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
28.01.2011, 15:55     operator #32
CyBOSSeR, Да про свободные я и имел ввиду. Про сеттеры/геттеры запомню, спасибо.

Про удобство доступа к френдам тут говорили... Такое везде сработает кстати? В MSVS работает корректно

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
class pub
{
public:
    pub(int a_=0):a(a_)
    {
    }
    friend int main(pub one);
private:
    int a;
};
 
int main(pub one)
{
    one.a=5;
    std::cout<<one.a<<'\n';
    return 0;
}
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
28.01.2011, 17:11     operator #33
Цитата Сообщение от ForEveR Посмотреть сообщение
Про удобство доступа к френдам тут говорили
Не стоит забывать, что использование дружественных классов/функции обосновано лишь в определенных случаях, не стоит ими злоупотреблять.

Цитата Сообщение от ForEveR Посмотреть сообщение
Такое везде сработает кстати? В MSVS работает корректно
В GCC тоже.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
28.01.2011, 18:05     operator #34
CyBOSSeR,
Не стоит забывать, что использование дружественных классов/функции обосновано лишь в определенных случаях, не стоит ими злоупотреблять.
Понятное дело)
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
28.01.2011, 18:49     operator #35
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Не стоит забывать, что использование дружественных классов/функции обосновано лишь в определенных случаях
Ну если уж на то пошло, то и перегрузка операторов (о коей идёт речь в этой теме) тоже обоснована лишь в случаях, когда это реально облегчает удобочитаемость и юзабельность кода))) И в этом случае не грех и френдами воспользоваться)))

Не по теме:

Это я всё в защиту френдов как перегруженных операторов... Сам не знаю, чего меня в эту сторону сегодня так понесло))) Уж извините)))

ISergey
29.01.2011, 02:04
  #36

Не по теме:

Да сколько можно ж*пу рвать чтобы доказать тот или иной способ решения задачи?.. пишите как удобно.. без особых затрат времени на это..

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.01.2011, 10:25     operator
Еще ссылки по теме:

C++ Expected init-declarator before "operator".expected `,' or `;' before "operator"
Operator = C++
Реализация operator + через operator += C++

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

Или воспользуйтесь поиском по форуму:
silent_1991
29.01.2011, 10:25     operator
  #37

Не по теме:

ISergey, баян Ну в смысле, я ещё на первой странице об этом сказал)))

Yandex
Объявления
29.01.2011, 10:25     operator
Ответ Создать тему
Опции темы

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