Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
mzarb
-211 / 7 / 1
Регистрация: 14.01.2013
Сообщений: 141
03.03.2013, 22:08     По поводу потока и перегрузки оператора вставки в классе #1
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 или что-то ещё?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.03.2013, 22:08     По поводу потока и перегрузки оператора вставки в классе
Посмотрите здесь:

Вопрос по поводу переворота строки и перегрузки << и >> C++
Вопрос по поводу перегрузки оператора + C++
C++ Friend-функции перегрузки оператора
Ошибка перегрузки + в классе C++
explicit конструктор и перегрузки в классе C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ITcrusader
Эксперт C++
 Аватар для 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); Поскольку << возвращает ссылку на поток.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
04.03.2013, 09:05     По поводу потока и перегрузки оператора вставки в классе #3
Цитата Сообщение от mzarb Посмотреть сообщение
сначала вызывается функция-член перегрузки оператора вставки в классе "three_d"
Это не функция-член и даже не дружественная функция.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
04.03.2013, 09:15     По поводу потока и перегрузки оператора вставки в классе #4
Цитата Сообщение от mzarb Посмотреть сообщение
Поток это какой то массив данных определенный в классе ostream или что-то ещё?
Что-то ещё.
Миниатюры
По поводу потока и перегрузки оператора вставки в классе  
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, будет два потока вывода?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
04.03.2013, 12:49     По поводу потока и перегрузки оператора вставки в классе #6
Цитата Сообщение от mzarb Посмотреть сообщение
Или же относить её к какому то классу не нужно, так как оператор вставки в данном случае работает только с паблик членами классов?
Да.

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

Добавлено через 3 минуты
Цитата Сообщение от alsav22 Посмотреть сообщение
Google, масса информации.
Я правда пытаюсь найти что-то, прежде чем просить помощи у других, просто есть моменты когда не понятно где и как искать, а если и найдется то не хватит знаний для переработки информации. Можно все таки вкратце ответить на задаваемые мной вопросы или на них есть ответ в книге, название которой вы привели?
alsav22
5282 / 4801 / 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, перегружают эти операторы, обычно, как дружественные функции.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 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
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;
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
04.03.2013, 21:41     По поводу потока и перегрузки оператора вставки в классе #13
Обычно, объект передают в такую функцию, как константную ссылку:
C++
1
friend ostream &operator<<(ostream &, const three_d &);
mzarb
-211 / 7 / 1
Регистрация: 14.01.2013
Сообщений: 141
05.03.2013, 14:14  [ТС]     По поводу потока и перегрузки оператора вставки в классе #14
Jupiter, Очень много незнакомых слов, хотелось бы какого-то абстрактного объяснения что ли, ясно что его будет мало, но хотя бы на первое время. Или же пока забыть об этом моменте, а в будущем сам прояснится при чтении книжек о устройстве системы?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.03.2013, 22:52     По поводу потока и перегрузки оператора вставки в классе
Еще ссылки по теме:

C++ Ошибка из книги оператора перегрузки
Подскажите по поводу перегрузки функции C++
Особенонсти перегрузки оператора запятая C++

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.03.2013, 22:52     По поводу потока и перегрузки оператора вставки в классе #15
Цитата Сообщение от mzarb Посмотреть сообщение
а в будущем сам прояснится при чтении книжек о устройстве системы?
По языку книги почитайте. Там это всё объясняется.
Yandex
Объявления
05.03.2013, 22:52     По поводу потока и перегрузки оператора вставки в классе
Ответ Создать тему
Опции темы

Текущее время: 01:39. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru