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

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

26.09.2015, 23:36. Показов 650. Ответов 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
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
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
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru