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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
mzarb
-211 / 7 / 1
Регистрация: 14.01.2013
Сообщений: 141
#1

По поводу потока и перегрузки оператора вставки в классе - C++

03.03.2013, 22:08. Просмотров 1569. Ответов 14
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;
class three_d {
public:
int x, y, z;
three_d(int a, int b, int c) { x=a; y=b; z=c; }
};
ostream &operator<<(ostream &stream, three_d obj)
{
stream << obj.x << ", ";
stream << obj.y << ", ";
stream << obj.z << "\n";
return stream;
}
int main()
{
three_d a(1, 2, 3), b(3, 4, 5), c(5, 6, 7);
cout << a << b << c;
return 0;
}
Есть пару вопросов.
1.) То есть в этом коде "cout << a << b << c;" сначала вызывается функция-член перегрузки оператора вставки в классе "three_d" для "b << c", потом для "a << b" и потом уже вызывается функция-член перегрузки оператора вставки в классе ostream для "cout << a"?
2.) Когда происходит вывод этого потока и вообще что понимается под потоком? То есть по умолчанию создан один поток и это объект cout типа ostream? А чтобы создать ещё один поток нужно сделать объявление "ostream a" и потоков уже будет два и это будет называться многопоточность? Поток это какой то массив данных определенный в классе ostream или что-то ещё?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.03.2013, 22:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос По поводу потока и перегрузки оператора вставки в классе (C++):

Вопрос по поводу перегрузки оператора + - C++
Всем привет.Подскажите как можно перегрузить оператор + в моем классе? И что лучше вернуть из перегруженной операции +=? Объект или...

Подскажите по поводу перегрузки функции - C++
Ребят где можна посмотреть примеры такого типа задач. 1. Написать перегруженные функции (int, double, char) для выполнения следующих...

Вопрос по поводу переворота строки и перегрузки << и >> - C++
помогите пожалуйста с моими ошибками. Задание создать ф-цию переворота строки и переопределение &gt;&gt; и &lt;&lt; #pragma once #include...

Ошибка перегрузки оператора - C++
Здравствуйте уважаемые программисты, при созданиии проэкта возникает ошибка In function 'int main()': 154 10 no 'operator++(int)'...

Целесообразность перегрузки оператора - C++
Изначально имелся такой вот метод (пусть будет методом класса &quot;A&quot;): //класс &quot;A&quot;, константная версия метода const Order &amp;operator...

Ошибка перегрузки + в классе - C++
Не понимаю в чём проблема, ошибка возникает во время работы программы, сообщает что продолжается запись после работы этого блока. ...

14
ITcrusader
Эксперт С++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
03.03.2013, 22:31 #2
Цитата Сообщение от mzarb Посмотреть сообщение
cout << a << b << c;
cout << a << b << c; аналогично (((cout << a) << b) << c); Поскольку << возвращает ссылку на поток.
1
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
04.03.2013, 09:05 #3
Цитата Сообщение от mzarb Посмотреть сообщение
сначала вызывается функция-член перегрузки оператора вставки в классе "three_d"
Это не функция-член и даже не дружественная функция.
1
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
04.03.2013, 09:15 #4
Цитата Сообщение от mzarb Посмотреть сообщение
Поток это какой то массив данных определенный в классе ostream или что-то ещё?
Что-то ещё.
1
Миниатюры
По поводу потока и перегрузки оператора вставки в классе  
mzarb
-211 / 7 / 1
Регистрация: 14.01.2013
Сообщений: 141
04.03.2013, 11:03  [ТС] #5
Цитата Сообщение от ITcrusader Посмотреть сообщение
cout << a << b << c; аналогично (((cout << a) << b) << c); Поскольку << возвращает ссылку на поток.
У меня была ассоциация с оператором равно, так как я знал, что в "a = b = c " нужно сначала "b = c", а потом "a = b". Тут перегрузка оператора вставки с двумя параметрами, по этому начинается с потока "cout << a". Но по какому принципу компилятор решает что нужно сделать с оператором равно или оператором вставки, просто сравнивает вызов и параметры в перегрузке функции, то есть в нем есть какой то код, что анализирует к примеру оператор равно и видит что нужно начать с конца, потому как значения присваиваются один одному, а в случае с оператором вставки вносятся в поток и по этому он берет первое, а потом остальные?

Добавлено через 10 минут
Цитата Сообщение от alsav22 Посмотреть сообщение
Это не функция-член и даже не дружественная функция.
Да, не досмотрел. Ну а если не функция-член то что? И она не относится к классу ostream? Видимо не относится, так как я же её там не объявлял, а просто написал реализацию, но а как тогда работает такая реализация без оператора видимости "", который бы показал что она относится к какому то классу? Или же относить её к какому то классу не нужно, так как оператор вставки в данном случае работает только с паблик членами классов?

Добавлено через 4 минуты
Цитата Сообщение от alsav22 Посмотреть сообщение
Что-то ещё.
Спасибо, а что за книга? То есть поток вывода и поток ввода, это два потока? Потоки работают с момента запуска программы и до её завершения и они будут всегда или только когда используются? Если cout - это объект/поток, то при объявлении другого объекта типа ostrem, будет два потока вывода?
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
04.03.2013, 12:49 #6
Цитата Сообщение от mzarb Посмотреть сообщение
Или же относить её к какому то классу не нужно, так как оператор вставки в данном случае работает только с паблик членами классов?
Да.

Добавлено через 59 секунд
Цитата Сообщение от mzarb Посмотреть сообщение
Спасибо, а что за книга?
Прата С. Язык программирования С++ Лекции и упражнения.
1
ITcrusader
Эксперт С++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
04.03.2013, 12:54 #7
Цитата Сообщение от mzarb Посмотреть сообщение
У меня была ассоциация с оператором равно, так как я знал, что в "a = b = c " нужно сначала "b = c", а потом "a = b".
Да, тут почитай по поводу право- и лево-ассоциативных операторов.
1
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
04.03.2013, 12:58 #8
Цитата Сообщение от mzarb Посмотреть сообщение
То есть поток вывода и поток ввода, это два потока? Потоки работают с момента запуска программы и до её завершения и они будут всегда или только когда используются? Если cout - это объект/поток, то при объявлении другого объекта типа ostrem, будет два потока вывода?
Google, масса информации.
1
mzarb
-211 / 7 / 1
Регистрация: 14.01.2013
Сообщений: 141
04.03.2013, 15:07  [ТС] #9
Цитата Сообщение от alsav22 Посмотреть сообщение
Да.
Нашел вот это "Действительно, ни функция вставки, ни функция извлечения не могут быть членами клас*са. Причина заключается в том, что если функция-оператор является членом класса, то левым операндом, неявно передаваемым с использованием указателя this, служит объект того класса, который осуществляет вызов функции-оператора.", я знаю что такое this, но при этом не понял ничего, можно как то на пальцах объяснить или пример привести?

Добавлено через 3 минуты
Цитата Сообщение от alsav22 Посмотреть сообщение
Google, масса информации.
Я правда пытаюсь найти что-то, прежде чем просить помощи у других, просто есть моменты когда не понятно где и как искать, а если и найдется то не хватит знаний для переработки информации. Можно все таки вкратце ответить на задаваемые мной вопросы или на них есть ответ в книге, название которой вы привели?
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
04.03.2013, 20:22 #10
Цитата Сообщение от mzarb Посмотреть сообщение
Я правда пытаюсь найти что-то, прежде чем просить помощи у других, просто есть моменты когда не понятно где и как искать, а если и найдется то не хватит знаний для переработки информации.
Если книги почитать? Так все делают.
Цитата Сообщение от mzarb Посмотреть сообщение
Нашел вот это "Действительно, ни функция вставки, ни функция извлечения не могут быть членами клас*са. Причина заключается в том, что если функция-оператор является членом класса, то левым операндом, неявно передаваемым с использованием указателя this, служит объект того класса, который осуществляет вызов функции-оператора.", я знаю что такое this, но при этом не понял ничего, можно как то на пальцах объяснить или пример привести?
На самом деле это не так. Могут, но синтаксис будет непривычный, поэтому и не делают их членами класса.
Например:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class A
{
    int x;
    
  public:
   A() { x = 5;}
   ostream& operator<<(ostream& out)
   {
        out << x;
        return out;
   }
}
 
int main()
{
   A obj;
   obj << cout;
 
};
То есть, при вызове перегруженного оператора (метода класса), слева должен быть сам объект класса.
Для того, чтобы слева мог быть объект iostream, перегружают эти операторы, обычно, как дружественные функции.
1
Jupiter
Каратель
Эксперт С++
6561 / 3982 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
04.03.2013, 21:34 #11
Цитата Сообщение от mzarb Посмотреть сообщение
А чтобы создать ещё один поток нужно сделать объявление "ostream a" и потоков уже будет два и это будет называться многопоточность? Поток это какой то массив данных определенный в классе ostream или что-то ещё?
http://ru.wikipedia.org/wiki/%D0%9F%...BD%D1%8B%D1%85

http://ru.wikipedia.org/wiki/%D0%9F%...BD%D0%B8%D1%8F
1
mzarb
-211 / 7 / 1
Регистрация: 14.01.2013
Сообщений: 141
04.03.2013, 21:35  [ТС] #12
alsav22, Ясно, спасибо что объяснили, а то печально попасть на такой текст и запомнить что нельзя и потом в будущем быть в ступоре когда кто-то скажет что можно, даже при всей простоте. А если использовать дружественную функцию, то приведенный код в первом посте будет выглядеть так :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
using namespace std;
class three_d {
public:
int x, y, z;
three_d(int a, int b, int c) { x=a; y=b; z=c; }
friend ostream &operator<<(ostream &, three_d);
};
ostream &operator<<(ostream &stream, three_d obj)
{
stream << obj.x << ", ";
stream << obj.y << ", ";
stream << obj.z << "\n";
return stream;
}
int main()
{
three_d a(1, 2, 3), b(3, 4, 5), c(5, 6, 7);
cout << a << b << c;
return 0;
}
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
04.03.2013, 21:41 #13
Обычно, объект передают в такую функцию, как константную ссылку:
C++
1
friend ostream &operator<<(ostream &, const three_d &);
1
mzarb
-211 / 7 / 1
Регистрация: 14.01.2013
Сообщений: 141
05.03.2013, 14:14  [ТС] #14
Jupiter, Очень много незнакомых слов, хотелось бы какого-то абстрактного объяснения что ли, ясно что его будет мало, но хотя бы на первое время. Или же пока забыть об этом моменте, а в будущем сам прояснится при чтении книжек о устройстве системы?
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.03.2013, 22:52 #15
Цитата Сообщение от mzarb Посмотреть сообщение
а в будущем сам прояснится при чтении книжек о устройстве системы?
По языку книги почитайте. Там это всё объясняется.
0
05.03.2013, 22:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.03.2013, 22:52
Привет! Вот еще темы с ответами:

Особенонсти перегрузки оператора запятая - C++
Препод на защите прошлой лабы задал вопрос - чем отличается перегрузка оператора запятая от других... Перерыл кучу статей, пишут только,...

Ошибка из книги оператора перегрузки - C++
// Листинг 10.10. // Возвращение безымянного временного объекта #include &lt;string&gt; #include &lt;iostream&gt; // для объекта cout using...

Friend-функции перегрузки оператора - C++
Всем доброго времени суток =) У меня есть следующий код заголовочного файла: enum month {jan = 1, feb, mar, apr, may, jun, jul, aug, sep,...

explicit конструктор и перегрузки в классе - C++
class Test { public: Test () { printf(&quot;Simple constructor\n&quot;); } Test (long) {...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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