Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
 Аватар для BTR
8 / 8 / 1
Регистрация: 01.11.2010
Сообщений: 157

operator

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

Студворк — интернет-сервис помощи студентам
Всем привет, опять непонятка в книге, дошел до оператора operator и ничего не понял, для чего он нужен, что он делает, то есть как он перегружает символы и как им пользоваться, привидите пожалуйста пример, заранее благодарен!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.01.2011, 22:20
Ответы с готовыми решениями:

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

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

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

36
28.01.2011, 08:27
Студворк — интернет-сервис помощи студентам

Не по теме:

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

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

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

Не по теме:

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

0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
28.01.2011, 09:31
Цитата Сообщение от 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
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
28.01.2011, 09:42
Обычные члены, ничего особенного. А что такое "свободные функции"?
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
28.01.2011, 09:44
taras atavin, у класса Bar operator+ - не член.

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

Не по теме:

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

0
 Аватар для taras atavin
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
28.01.2011, 09:49
Далеко не все классы могут не иметь protected и private членов, а операторам могут потребоваться любые существующие члены.
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
28.01.2011, 10:13
Цитата Сообщение от 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
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
28.01.2011, 10:24
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
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
28.01.2011, 10:26
Что "и"? Если класс имеет protected, а оператору нужен именно этот член, то попробуй ка сделать именно так.
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
28.01.2011, 11:39
silent_1991, а... Я не правильно понял твою фразу . Все Ок.

Цитата Сообщение от taras atavin Посмотреть сообщение
Если класс имеет protected, а оператору нужен именно этот член, то попробуй ка сделать именно так.
Во-первых, все зависит от ситуации, во-вторых, есть дружественные функции.
Общее правило: если есть выбор между свободной функцией не другом и функцией членом, выбор лучше сделать в сторону свободной функции.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
28.01.2011, 15:55
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;
}
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
28.01.2011, 17:11
Цитата Сообщение от ForEveR Посмотреть сообщение
Про удобство доступа к френдам тут говорили
Не стоит забывать, что использование дружественных классов/функции обосновано лишь в определенных случаях, не стоит ими злоупотреблять.

Цитата Сообщение от ForEveR Посмотреть сообщение
Такое везде сработает кстати? В MSVS работает корректно
В GCC тоже.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
28.01.2011, 18:05
CyBOSSeR,
Не стоит забывать, что использование дружественных классов/функции обосновано лишь в определенных случаях, не стоит ими злоупотреблять.
Понятное дело)
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
28.01.2011, 18:49
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Не стоит забывать, что использование дружественных классов/функции обосновано лишь в определенных случаях
Ну если уж на то пошло, то и перегрузка операторов (о коей идёт речь в этой теме) тоже обоснована лишь в случаях, когда это реально облегчает удобочитаемость и юзабельность кода))) И в этом случае не грех и френдами воспользоваться)))

Не по теме:

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

0
29.01.2011, 02:04

Не по теме:

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

0
29.01.2011, 10:25

Не по теме:

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

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.01.2011, 10:25

Перегрузка operator>> и operator<< в абстрактном классе
Здрасьте! Есть необходимость перегрузить потоки, Я знаю как это сделать через friend, но вот кажется что есть и другое решение. Попытался...

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
37
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru