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

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

Войти
Регистрация
Восстановить пароль
 
Unifan
0 / 0 / 0
Регистрация: 11.08.2014
Сообщений: 40
#1

Зачем нужно возвращать ссылку на объекты потоковых типов? - C++

16.08.2014, 20:12. Просмотров 820. Ответов 4
Метки нет (Все метки)

В книжке Герберта Шилдта четко и ясно указано, что для того, чтобы перегружать операции ввода-вывода, надо возвращать ссылку на объект потоковых типов, вроде примеров, приведенных ниже.
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ostream &operator<<(ostream &stream_left, ThreeD &obj_right)
{
    stream_left << obj_right.x << ", ";
    stream_left << obj_right.y << ", ";
    stream_left << obj_right.z;
 
    return stream_left;
}
 
istream &operator>>(istream &stream_left, ThreeD &obj_right)
{
    cout << "Введите значения X, Y, Z: ";
    stream_left >> obj_right.x >> obj_right.y >> obj_right.z;
    return stream_left;
}
Хочется узнать, почему возвращается именно ссылка на объект, а не сам объект, ведь если принять во внимание тот факт, что istream и ostream - это классы, то получается, что объекты этих классов должны возвращаться и без ссылки, то есть таким образом.
C++ (Qt)
1
2
3
4
5
6
7
8
ostream operator<<(ostream &stream_left, ThreeD &obj_right)
{
    stream_left << obj_right.x << ", ";
    stream_left << obj_right.y << ", ";
    stream_left << obj_right.z;
 
    return stream_left;
}
Из-за чего мы должны возвращать именно ссылку на объекты именно этих классов?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.08.2014, 20:12
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Зачем нужно возвращать ссылку на объекты потоковых типов? (C++):

Зачем возвращать конструктор копирование? - C++
Добрый день. Первый вопрос в заголовке темы. Второй - где это можно применить. Спасибо. #include &lt;iostream&gt; class MyBase { ...

Может ли виртуальная функция возвращать значения разных типов? - C++
Привет, форумчане! :) Столкнулся с небольшой проблемкой и интересуюсь ответом на вопрос! Может ли виртуальная функция возвращать...

Почему перегруженный оператор = должен возвращать ссылку на объект - C++
Объясните доступно пожалуйста. Почему перегруженный оператор= должен возвращать ссылку на объект? А оператор+ может возвращать как...

Уточняющий вопрос: почему при перегрузке оператора [] необходимо возвращать ссылку? - C++
Сабж. Ну, то есть есть класс, что-то такое: #include &lt;iostream&gt; using namespace std; class arr { public: explicit...

Когда нужно/не нужно возвращать объект при перегрузке присваивания? - C++
Доброго времени суток! Перегрузка присваивания: class alpha { private: int data; public: alpha() // конструктор без...

Зачем нужны модификаторы типов? - C++
Читаю Шилдта и все более менее понятно,но насчет unsigned , signed , shot , long что то вообще дыра в понимании и их пропускал,а потом...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Croessmah
Модератор
Эксперт CЭксперт С++
13134 / 7397 / 828
Регистрация: 27.09.2012
Сообщений: 18,227
Записей в блоге: 3
Завершенные тесты: 1
16.08.2014, 20:19 #2
Цитата Сообщение от Unifan Посмотреть сообщение
почему возвращается именно ссылка на объект, а не сам объект
так и возвращается сам объект, а не копия. Ну попробуйте сделать без ссылки
DrOffset
7090 / 4231 / 950
Регистрация: 30.01.2014
Сообщений: 7,006
16.08.2014, 20:38 #3
Цитата Сообщение от Unifan Посмотреть сообщение
Из-за чего мы должны возвращать именно ссылку на объекты именно этих классов?
Во-первых зачем нам лишнее копирование?
Во-вторых, для потоков, копирование не имеет смысла, поэтому операция присваивания и конструктор копирования там закрыты.
В третьих все стандартные операторы << и >> определены со ссылками.
gru74ik
Модератор
Эксперт CЭксперт С++
4150 / 1776 / 197
Регистрация: 20.02.2013
Сообщений: 4,898
Записей в блоге: 21
16.08.2014, 23:12 #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Unifan Посмотреть сообщение
почему возвращается именно ссылка на объект
А что такое "ссылка на объект"? Остановись на секунду и задумайся. Ведь ты уже, наверное, читал, что ссылка (reference) - это, фактически, просто псевдоним переменной. То есть ссылка - это и есть та самая переменная, только имя у неё другое. У ссылки будет тот же адрес и то же значение, что и у твоей переменной. Это как если бы тебя звали, скажем, Станислав (имя переменной), а дома тебя звали Стас (ссылка), а друзья звали бы тебя по прозвищу "Лохматый" (за привычку вечно брить голову "под ноль"). Тут "Лохматый" - ещё одна ссылка на переменную "Станислав" типа человек. Вот тебе твой "генетический" С++-код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
class Human
{
private:
    // some data
    
public:
    // some methods
};
 
int main ()
{
    Human stanislav;            // переменная Станислав типа человек
    Human & stas = stanislav;   // ссылка на переменную Станислав типа человек
    Human & shaggy = stanislav; // ещё одна ссылка на переменную Станислав типа человек
 
    return 0;
}
Когда же ты обращаешься к объекту по его имени (например, передаешь объект в качестве параметра в функцию или указываешь возвращаемое из функции значение), то функция, на самом деле, использует не сам объект (как в случае с ссылкой), а делает для своих нужд копию объекта.
Убежденный
Системный программист
Эксперт С++
15511 / 7009 / 1108
Регистрация: 02.05.2013
Сообщений: 11,441
Завершенные тесты: 1
16.08.2014, 23:24 #5
Цитата Сообщение от Unifan Посмотреть сообщение
Хочется узнать, почему возвращается именно ссылка на объект, а не сам объект
Я отвечу кодом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <string>
 
using namespace std;
 
struct mystream
{
    string AllData;
};
 
mystream operator << (mystream Stream, string Data)
{
    Stream.AllData += Data;
    return Stream;
}
 
int main()
{
    mystream Stream;
    Stream << "Hello" << ", " << "World!";
    cout << Stream.AllData << endl;
    return 0;
}
> (пусто)
А теперь перепишем оператор вывода "по учебнику":
C++
1
2
3
4
5
mystream & operator << (mystream & Stream, string Data)
{
    Stream.AllData += Data;
    return Stream;
}
> Hello, World!
Задумайтесь [think about ], какое поведение более ожидаемо для
объектов cout/ofstream и т.п.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.08.2014, 23:24
Привет! Вот еще темы с ответами:

Объекты и приведение типов - C++
Добрый день. Я написал класс, на подобии std::string, только для типа wchar_t. Вот сам класс: #pragma once #include &lt;iostream&gt; ...

Считать объекты из файла разных типов - C++
Добрый день, имеется текстовый файл такого вида: fgfd 32 cxv 54 43 hmgg 65 54 23

объекты двух типов SymbString и DecString - C++
Написать программу, демонстрирующую работу с объектами двух типов: SymbString(символьная строка) и DecString(десятичная строка), для чего...

Объекты разных типов в одном контейнере и c++ 11 auto - C++
Собственно дабы упростить себе жизнь, решил использовать auto но столкнулся с траблом... class TWireObj{ public: TWireObj(auto...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
16.08.2014, 23:24
Ответ Создать тему
Опции темы

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