1.9 Ссылки

1.9 Ссылки

К сожалению, последняя версия ostream содержит серьезную ошибку и к тому же очень неэффективна. Сложность состоит в том, что ostream копируется дважды при каждом использовании ««: один раз как параметр и один раз как возвращаемое значение. Это оставляет state неизмененным после каждого вызова. Необходима возможность передачи указателя на ostream вместо передачи самого ostream.

Это можно сделать с помощью ссылок. Ссылка действует как имя для объекта. T amp; означает ссылку на T. Ссылка должна быть инициализирована, и она становится другим именем того объекта, которым она инициализирована. Например:

ostream amp; s1 = my_out; ostream amp; s2 = cout;

Теперь можно использовать ссылку s1 и my_out одинаково, и они будут иметь одинаковые значения. Например, присваивание

s1 = s2;

копирует объект, на который ссылается s2 (то есть, cout), в объект, на который ссылается s1 (то есть, my_out). Члены берутся с помощью операции точка

s1.put(«не надо использовать -»»);

а если применить операцию взятия адреса, то вы получите адрес объекта, на который ссылается ссылка:

amp;s1 == amp;my_out

Первая очевидная польза от ссылок состоит в том, чтобы обеспечить передачу адреса объекта, а не самого объекта, в функцию вывода (в некоторых языках это называется вызов по ссылке):

ostream amp; operator««(ostream amp; s, complex z) (* return s «« "(" «« z.real «« "," «« z.imag «« ")"; *)

Достаточно интересно, что тело функции осталось без изменений, но если вы будете осуществлять присваивание s, то будете воздействовать на сам объект, а не на его копию. В данном случае то, что возвращается ссылка, также повышает эффективность, поскольку очевидный способ реализации ссылки – это указатель, а передача указателя гораздо дешевле, чем передача большой структуры данных.

Ссылки также существенны для определения потока ввода, поскольку операция ввода получает в качестве операнда переменную для считывания. Если бы ссылки не использовались, то пользователь должен был бы явно передавать указатели в функции ввода.

class istream (* //... int state; public: istream amp; operator»»(char amp;); istream amp; operator»»(char*); istream amp; operator»»(int amp;); istream amp; operator»»(long amp;); //... *);

Заметьте, что для чтения long и int используются разные функции, тогда как для их печати требовалась только одна. Это вполне обычно, и причина в том, что int может быть преобразовано в long по стандартным правилам неявного преобразования (#с.6.6), избавляя таким образом программиста от беспокойства по поводу написания обеих функций ввода.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг:

Ссылки

Из книги автора

Ссылки Осталось рассмотреть еще один момент, связанный с организацией доступа к данным. Это так называемые ссылки — своего рода указатели на массивы и экземпляры объектов (о них будет рассказано далее), хранящиеся в соответствующих им переменных.Когда мы создаем массив,


4.3.Ссылки

Из книги автора

4.3.Ссылки Иногда очень полезно, чтобы в каталоге находился один и тот же файл, но под разными именами. Можно просто скопировать этот файл в другой, но при этом неэффективно используется дисковое пространство. Для этих целей в ОС Linux существует специальный тип файлов —


19.6.11 Ссылки

Из книги автора

19.6.11 Ссылки Чтобы включить в документ ссылку, нужно:? Использовать теги начала и конца ссылки? Указать URL связанного со ссылкой документа? Обеспечить метку для щелчка мышью (обычно выводится подчеркиванием или голубым цветом).Ниже показан пример ссылки. Символ А


Ссылки

Из книги автора

Ссылки Как можно с одной страницы сайта попасть на другую? Ответ прост — при помощи ссылок. На любом сайте есть меню, нажатия на пункты которого обеспечивает переход в нужный раздел. Все пункты меню, как текстовые, так и в виде картинок, являются ссылками. Когда вы задаете


Ссылки

Из книги автора

Ссылки На вкладке Ссылки собрано все, что касается расстановки по тексту различных ссылок и


Ссылки

Из книги автора

Ссылки Ссылки на книги Джосаттиса и Остерна в предыдущем абзаце дают представление о том, как в этой книге оформляются библиографические ссылки. Как правило, я стараюсь включить в ссылку достаточно информации, чтобы ее узнали люди, уже знакомые с этим трудом. Если вы уже


Ссылки

Из книги автора

Ссылки Разработчик Delphi Русскоязычные N Сервер Описание 1 http://www.inprise.ru Российское представительство Inprise Фирма – разработчик


5.7. Ссылки

Из книги автора

5.7. Ссылки В Linux допускается, чтобы один и тот же файл существовал в системе под разными именами. Для этого используются ссылки двух типов: жесткие и символические. Первые жестко привязываются к файлу — вы не можете удалить файл, пока на него указывает хотя бы одна жесткая


8.6.3 Ссылки

Из книги автора

8.6.3 Ссылки Когда переменная описана как T amp;, то есть «ссылка на тип T», она должна быть инициализирована или объектом типа T, или объектом объектом, который может быть преобразован в T. Ссыка становится другим именем объекта. Например:int i; int amp; r = i; r = 1; // значение i становится 1


2.5. Ссылки

Из книги автора

2.5. Ссылки 2.5.1. В программных документах допускаются ссылки на стандарты (кроме стандартов предприятий), технические условия и другие документы (например, документы органов Государственного надзора, правила и нормы Госстроя СССР). При ссылках на стандарты и технические


Ссылки

Из книги автора

Ссылки Вы, наверное, слышали о ссылках и гиперссылках? Чем же ссылка отличается от гиперссылки? Честно говоря, ничем. Просто гиперссылка звучит посолиднее. На самом деле, если из контекста понятно, о чем идет речь, то можно употребить слово «ссылка». Если существует некая