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

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

Восстановить пароль Регистрация
 
Unifan
 Аватар для Unifan
0 / 0 / 0
Регистрация: 11.08.2014
Сообщений: 40
16.08.2014, 20:12     Зачем нужно возвращать ссылку на объекты потоковых типов? #1
В книжке Герберта Шилдта четко и ясно указано, что для того, чтобы перегружать операции ввода-вывода, надо возвращать ссылку на объект потоковых типов, вроде примеров, приведенных ниже.
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)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11841 / 6820 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 2
Завершенные тесты: 1
16.08.2014, 20:19     Зачем нужно возвращать ссылку на объекты потоковых типов? #2
Цитата Сообщение от Unifan Посмотреть сообщение
почему возвращается именно ссылка на объект, а не сам объект
так и возвращается сам объект, а не копия. Ну попробуйте сделать без ссылки
DrOffset
6458 / 3832 / 885
Регистрация: 30.01.2014
Сообщений: 6,627
16.08.2014, 20:38     Зачем нужно возвращать ссылку на объекты потоковых типов? #3
Цитата Сообщение от Unifan Посмотреть сообщение
Из-за чего мы должны возвращать именно ссылку на объекты именно этих классов?
Во-первых зачем нам лишнее копирование?
Во-вторых, для потоков, копирование не имеет смысла, поэтому операция присваивания и конструктор копирования там закрыты.
В третьих все стандартные операторы << и >> определены со ссылками.
gru74ik
Модератор
 Аватар для gru74ik
3121 / 1347 / 167
Регистрация: 20.02.2013
Сообщений: 3,852
Записей в блоге: 17
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;
}
Когда же ты обращаешься к объекту по его имени (например, передаешь объект в качестве параметра в функцию или указываешь возвращаемое из функции значение), то функция, на самом деле, использует не сам объект (как в случае с ссылкой), а делает для своих нужд копию объекта.
Убежденный
Системный программист
 Аватар для Убежденный
14209 / 6224 / 987
Регистрация: 02.05.2013
Сообщений: 10,368
Завершенные тесты: 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 и т.п.
Yandex
Объявления
16.08.2014, 23:24     Зачем нужно возвращать ссылку на объекты потоковых типов?
Ответ Создать тему
Опции темы

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