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

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

26.09.2015, 23:36. Показов 692. Ответов 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,818
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
Ответ Создать тему
Новые блоги и статьи
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача №1: при указании работ (справочник РаботыПоРемонтуСпецтехники),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru