Какова цель использования ссылок на функции и объекты ввода-вывода (в качестве аргументов)? - PullRequest
1 голос
/ 28 октября 2019

Почему ссылки на потоки ввода-вывода используются вместо самих потоков? И тот же вопрос о ссылке на функцию. Пытаясь изучить эту тему, я все еще не могу понять ее.

В приведенном ниже коде функция печатает результат только из данного объекта QueryResult в его указанном потоке.

//declaration  
 ostream & print(ostream & os, const QueryResult &qr);

Ответы [ 4 ]

4 голосов
/ 28 октября 2019

Как вы уже должны знать, что во время вызова функции аргументы копируются в параметры функции. Но классы ввода-вывода не позволяют копировать их объекты. Следовательно, мы не можем передать объект (istream или ostream) напрямую. или, проще говоря,

Поскольку мы не можем копировать типы ввода-вывода, у нас не может быть параметра или возвращаемого типа, который является одним из типов потока. Функции, которые выполняют IO, обычно передают и возвращают поток через ссылки.

еще одна вещь.

Чтение или запись объекта IO изменяет его состояние, поэтому ссылка не должна быть постоянной

4 голосов
/ 28 октября 2019

Здесь нет «ссылки на функцию». Первый & является частью возвращаемого типа.

ostream& print(ostream& os, const QueryResult& qr);

Функция возвращает ostream& и принимает ostream& в качестве параметра, поскольку потоки не могут быть скопированы. QueryResult передается как постоянная ссылка, чтобы избежать возможно дорогой копии.

1 голос
/ 29 октября 2019

Объект ввода-вывода не может быть скопирован, поэтому у нас не может быть возврата или параметра типа ввода-вывода. Поэтому для выполнения операции ввода-вывода мы должны передать ссылку на объект ввода-вывода для выполнения каскадирования.

0 голосов
/ 28 октября 2019

Это полезно в цепочке методов. Цель состоит в том, чтобы вернуть свежую ссылку на поток, который может быть передан следующему вызову оператора << () в цепочке. </p>

...