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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.86
BTR
8 / 8 / 1
Регистрация: 01.11.2010
Сообщений: 157
#1

operator - C++

24.01.2011, 22:20. Просмотров 1869. Ответов 36
Метки нет (Все метки)

Всем привет, опять непонятка в книге, дошел до оператора operator и ничего не понял, для чего он нужен, что он делает, то есть как он перегружает символы и как им пользоваться, привидите пожалуйста пример, заранее благодарен!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.01.2011, 22:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос operator (C++):

Class & operator's |Error: undefined reference to operator - C++
Компилирует нормально, но когда хочу использовать оператор выдает ошибку:undefined reference to 'operator..(Fraction const&, Fraction...

Вызов operator[] через operator[] const - C++
Перелистывал Майерса, наткнулся на код, подскажите пожалуйста почему он советует закомментированный вариант кода, не проще сделать как...

operator char() или operator int() - C++
Здорова госпдо! Снова ничо не ясно как всегда. Разбираю программку из книги Страуструпа, там он описывает класс String в нем есть ...

Реализация operator + через operator += - C++
внутри следующей темы возник вопрос, ответ на который так и не был получен: ...

Перегрузить операторы operator+() и operator*() в пользовательском классе "Комплексное число" - C++
Здравствуйте. Предлагаю заняться арифметикой. Создал прослейший класс, перегрузил операторы сложения и умножения, в конструкторе...

Operator +, operator += — какой через какой реализовывать? - C++
Для class Fraction { // ... public: Fraction operator + ( const Fraction& right ) const; Fraction& operator += ( const...

36
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
28.01.2011, 06:19 #16
Я много раз сам делал френдовые операторы, но в данном случае надо членами, так как оба операнда - экземпляры одного класса.

Добавлено через 6 минут
Кстати, у меня бывает, что воообще ни один операнд, например, оператора умножения не является объектом какого либо класса, при этом они имеют разные типы между собой, а тип возвращаемого значения вообще третий. Например, я часто умножаю double на enum, а возвращаю объект. В таких случаях никуда от френда.
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
28.01.2011, 07:03 #17
taras atavin, С чего вдруг через глобалы нельзя? Мне как раз такой подход больше нравится...
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
28.01.2011, 07:05 #18
А как ты собираешься получить доступ к закрытым членам?
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
28.01.2011, 08:02 #19

Не по теме:

taras atavin, уже обсудили же, сеты/геты решают в этом случае)))
А почему вы так упёрлись в члены и так категорично заявляете "нельзя френдами, если можно мемберами"?



Добавлено через 1 минуту

Не по теме:

ForEveR, taras atavin, нормально, три типа спорят, и каждый проталкивает способ, который ему больше нравится)))
Мы же знаем, господа, что это ни к чему не приведёт)))

0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
28.01.2011, 08:21 #20
Цитата Сообщение от silent_1991 Посмотреть сообщение
"нельзя френдами, если можно мемберами"?
Нельзя обычными глобальными функциями. А френдами можно, но в данном случае не нужно. Что они в данном конкретном случае дают про сравнению с членами? Только то, что при наследовании будет легче запутаться.
0
silent_1991
28.01.2011, 08:27
  #21

Не по теме:

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

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

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

Не по теме:

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

0
CyBOSSeR
Эксперт С++
2303 / 1673 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
28.01.2011, 09:31 #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, сеттеры и геттеры к инкапсуляции имеют очень слабое отношение.

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

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

Не по теме:

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

0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
28.01.2011, 09:49 #27
Далеко не все классы могут не иметь protected и private членов, а операторам могут потребоваться любые существующие члены.
0
CyBOSSeR
Эксперт С++
2303 / 1673 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
28.01.2011, 10:13 #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 членов, а операторам могут потребоваться любые существующие члены
И?
1
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
28.01.2011, 10:24 #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;
}
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
28.01.2011, 10:26 #30
Что "и"? Если класс имеет protected, а оператору нужен именно этот член, то попробуй ка сделать именно так.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.01.2011, 10:26
Привет! Вот еще темы с ответами:

Чем "operator *=" отличается от "operator *"? - C++
снова застряла, не могу понять, чем этот оператор должен отличаться от оператора*.....? вот он, но это работает только в случае...

Expected init-declarator before "operator".expected `,' or `;' before "operator" - C++
Пример не мой. Пытаюсь у себя запустить и чтото неполучается. Ошибка на строке 24 Expected init-declarator before &quot;operator&quot;.Expected...

Operator*=(); - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace::std; class Distance //Класс английских длин { ...

Operator + - C++
Создайте в классе Circle оператор + для сложения объектов типа Circle. Необходимо складывать только величины радиусов itsRadius. ...


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

Или воспользуйтесь поиском по форуму:
30
Yandex
Объявления
28.01.2011, 10:26
Ответ Создать тему
Опции темы

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