Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
0 / 0 / 1
Регистрация: 16.11.2014
Сообщений: 85

Объясните работу кода с перегрузкой операторов

26.09.2015, 23:36. Показов 661. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте

Код:
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
#include <iostream>
 
using namespace std;
 
class A
{
public:
  int number;
  A() : number(0){}
  friend ostream& operator<<(ostream& os, A& a){
    os<<a.number;
  }
  A& operator++(){
    number++;
    return *this;
  }
  A operator++(int){
    A a(*this);
    ++(*this);
    return a;
  }
};
 
int main()
{
  A a1;
 
  cout<<++a1<<", "<<++a1<<endl;
  
  return 0;
}
Выводит 2, 2

Возник следующий вопросик: почему 2, 2 а не 1, 2.
И вообще какие действия происходят в этом коде?
C++
1
 cout<<++a1<<", "<<++a1<<endl;
Сначала ++а1 потом ++а1, а потом вывод как я понял.
Все происходит согласно приоритетам операций.
Если изменить код:
C++
1
 cout<<a1++<<", "<<++a1<<endl;
то сначала выполнится ++а1, а потом а1++ да?

И ещо как устранить эту ошибку:
C++
1
2
 no match for ‘operator<<(operand types are ‘std::ostream {aka std::basic_ostream<char>}and ‘A’)
   cout<<a1++<<", "<<++a1<<endl;
Я ж переопредилил оператор<<.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.09.2015, 23:36
Ответы с готовыми решениями:

Объясните работу кода
&lt;?php ## Сериализация объекта класса user // Подключаем сериализацию класса require_once(&quot;user.php&quot;); // Создаем...

Объясните работу кода
изучаю opengl по данному уроку http://www.learnopengl.com/#!Lighting/Colors проблема с освещением. почему там рисуется два кубика, если...

Объясните работу кода
Объясните пожалуйста некоторые моменты в работе кода. А то нужно подобное провернуть на С# require 'chunky_png' include...

9
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
26.09.2015, 23:52
Цитата Сообщение от Lokki23 Посмотреть сообщение
то сначала выполнится ++а1, а потом а1++ да?
Нет. В пределах одной точки следования, эти операторы выполняются в порядке заданном левой пяткой компилятора.
Цитата Сообщение от Lokki23 Посмотреть сообщение
И ещо как устранить эту ошибку:
Принимать в операторе const A&. operator++(int) возвращает временный объект который можно привести к A&& (rvalue), но нельзя к A&.
0
 Аватар для SerVal
37 / 36 / 9
Регистрация: 16.04.2015
Сообщений: 283
26.09.2015, 23:53
C++
1
2
3
4
 friend ostream& operator<<(ostream& os, A& a){
    os<<a.number;
    return os;
  }
0
265 / 165 / 56
Регистрация: 25.02.2015
Сообщений: 435
27.09.2015, 00:01
дело не в этом операторе. у вас сперва вычисляются аргументы для вызова операторов <<, а потом уже они передаются в эти операторы. т.к. это ссылка на один и тот же объект - то в них передается одно и то же. чтобы этого не было, разрежте цепочку точкой с запятой. вот тут посмотрите что в какой порядке вызывается:
http://cpp.sh/7pji

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
#include <iostream>
 
using namespace std;
 
class A
{
public:
  int number;
  A() : number(0){}
  friend ostream& operator<<(ostream& os, A& a){
    std::cout << "operator <<" << std::endl;
    os<<a.number;
  }
  A& operator++(){
    std::cout << "operator ++()" << std::endl;
    number++;
    return *this;
  }
  A operator++(int){
    std::cout << "operator ++(int)" << std::endl;
    A a(*this);
    ++(*this);
    return a;
  }
};
 
int main()
{
 
  { 
    A a1;
    cout<<++a1<<", "<<++a1<<endl;
  } 
  std::cout << "#####################" << std::endl;
  { 
    A a1;
    cout<<++a1;
    cout<<", "<<++a1<<endl;
    std::cout << "#####################" << std::endl;
  } 
 
  return 0;
}
operator ++()
operator ++()
operator <<
2, operator <<
2
#####################
operator ++()
operator <<
1operator ++()
, operator <<
2
#####################
0
0 / 0 / 1
Регистрация: 16.11.2014
Сообщений: 85
27.09.2015, 00:37  [ТС]
Принимать в операторе const A&. operator++(int) возвращает временный объект который можно привести к A&& (rvalue), но нельзя к A&
Что то я ничего не понял. Как устранить ошибку?

Добавлено через 7 минут
И ещо хотел спросить насчет:
C++
1
2
3
4
5
A operator++(int){
    A a(*this);
    ++(*this);
    return a;
  }
Когда а будит удален? По идеи в коньце функции то как мы можем его использовать дальше в мейне?

C++
1
A a2 = a++;
не работает.

Как быть?

Добавлено через 9 минут
Да
C++
1
2
3
4
5
const A& operator++(int){
    A a(*this);
    ++(*this);
    return a;
  }
Работает но есть ли это безопасно?
reference to local variable ‘a’ returned
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
27.09.2015, 00:42
Цитата Сообщение от Lokki23 Посмотреть сообщение
Что то я ничего не понял. Как устранить ошибку?
ostream& operator<<(ostream& os, const A& a)
Цитата Сообщение от Lokki23 Посмотреть сообщение
Когда а будит удален? По идеи в коньце функции то как мы можем его использовать дальше в мейне?
Именно в таком объявлении, функция по бумагам возвращает копию a. По факту, оптимизатор может решить "нафиг оно нужно, создам объект сразу в памяти мейна" (RVO/NRVO).
Цитата Сообщение от Lokki23 Посмотреть сообщение
const A& operator++(int){
А так возвращается только ссылка на локальный объект, который сразу после этого дохнет. Конечно, нормально работать не будет.
0
0 / 0 / 1
Регистрация: 16.11.2014
Сообщений: 85
27.09.2015, 01:11  [ТС]
Спс
Но всё равно одно не понял
ostream& operator<<(ostream& os, const A& a) почему без const не работает. Какая разница принимаю я обєкт по константной ссылке или нет.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
27.09.2015, 01:24
Цитата Сообщение от Lokki23 Посмотреть сообщение
Какая разница принимаю я обєкт по константной ссылке или нет.
Вопрос к авторам C++98, запретившим брать не константную ссылку на временный объект. Если очень нужно не константную ссылку, то в C++11 можно вывернуться через ostream& operator<<(ostream& os, A&& a){return operator<<(os,a);} (принимает временный объект, редиректит на метод кушающий не константную ссылку).
0
0 / 0 / 1
Регистрация: 16.11.2014
Сообщений: 85
27.09.2015, 01:42  [ТС]
Прикольно не знал об етом спс.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
27.09.2015, 01:47
Цитата Сообщение от Lokki23 Посмотреть сообщение
Какая разница принимаю я обєкт по константной ссылке или нет.
Ответ в книге "Дизайн и Эволюция C++", глава 3.9 - Ссылки.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.09.2015, 01:47
Помогаю со студенческими работами здесь

Объясните работу кода
Здравствуйте, не могу понять работу следующего кода: #include &lt;iostream&gt; using namespace std; int main() { char buff =...

Объясните работу кода
Вот прога для записи номера числа в последовательности Фибоначчи. Вопрос в том, что я не могу понять как проходит, по этапно, цикл, как...

объясните работу кода
&lt;?php ## Замена по шаблону. $text = htmlspecialchars(file_get_contents(__FILE__)); $html = preg_replace('/(\$\w*)/is',...

Объясните работу кода
&lt;?php ## Пример второй. // Найти в тексте адрес E-mail. \S означает &quot;не пробел&quot;, а + - // &quot;любое число букв, цифр или...

Объясните работу этого кода
Приветствую только начал изучать JS по учебнику. Сейчас тема объектов. Натолкнулся там на такой пример, который вообще никак не догоняю....


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru