|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Рекомендации по работе со ссылками
Ссылку следует рассматривать, как псевдоним переменной, которой она инициализирована. Ссылки отличаются от указателей тем, что позволяют компилятору лучше оптимизировать программный код. Для возврата значений из процедур (через параметры) предпочтение следует отдавать указателям, а не ссылкам. Ссылки следует использовать лишь в тех случаях, когда известно, что возвращаемый объект должен создаваться не в динамической памяти, а на стеке, то есть ссылки применяют при возврате value-type-объектов.
Передача аргументов по ссылке и передача по значению выглядят идентичными.
Если требуется, чтобы функция использовала передаваемую ей информацию, но не изменяла ее, и при этом использовать ссылку, следует воспользоваться постоянной ссылкой.
const double &r
Ссылочные аргументы полезно применять для более крупных элементов данных, таких как структуры и классы.
cube (double & ref); double z = cube (x + 3.0); // может привести к ошибке компиляции
В современном языке С++ это ошибка, и некоторые компиляторы выведут сообщение об этом, другие – просто отобразят предостережение, что при вызове используется временная переменная в качестве параметра. Язык С++ в первые годы своего становления допускал передачу выражений в качестве ссылочных переменных. В некоторых случаях это допускается и сейчас. Происходит следующее: программа создает временную переменную, не имеющую имени, инициализируя ее значением выражения х + 3. Затем ref становится ссылкой на эту временную переменную.
Когда создаются временные переменные:
С++ может создавать временную переменную, если передаваемый аргумент не соответствует определению ссылочного аргумента. В настоящее время С++ допускает это только в случае, когда аргументом является ссылка со спецификатором const, но это тоже новое ограничение.
При условии, что ссылочный параметр имеет спецификатор const, компилятор генерирует временную переменную в двух случаях: • Когда тип фактического аргумента выбран правильно, но сам параметр не является lvalue (L-значением). • Когда тип фактического параметра выбран неправильно, но может быть преобразован в правильный тип. Аргумент, являющийся значением lvalue (L-значением), представляет собой объект данных, на который можно ссылаться. Примерам может служить переменная, элемент массива, элемент структуры, ссылка и разыменаванный указатель – все они являются L-значениями. К L-значениям не относятся литеральные константы и выражения, состоящие из нескольких элементов.
Одним словом, если назначение функции со ссылочными аргументами состоит в том, чтобы модифицировать переменные, передаваемые в качестве аргументов, ситуация, которую создают временные переменные, препятствуют достижению этой цели.
В этом случае решение заключается в том, чтобы запретить создание временных переменных, и новый стандарт С++ реализует именно этот подход. (Однако некоторые компиляторы по умолчанию выводят предупреждение вместо сообщения об ошибке. Поэтому не игнорируйте сообщения об использовании временных переменных.)
Существуют три "железных" довода в пользу объявления ссылочных аргументов в качестве ссылок на константы: • Применение спецификатора const предотвращает программные ошибки, которые приводят к непреднамеренному изменению данных. • Применение спецификатора const позволяет функции выполнять обработку формальных аргументов как со спецификатором const, так и без него. • Использование ссылки со спецификатором const позволяет функции генерировать и использовать временные переменные по мере необходимости.
Ссылку можно использовать в качестве возвращаемого значения. Обычно механизм возврата копирует возвращаемое значение во временную область памяти, к которой вызывающая программа затем осуществляет доступ. Однако возврат ссьшки означает, что вызывающая программа выполняет прямой доступ к возвращаемому значению без использования приготовленной заранее копии. В обычных случаях такая ссылка указывает на ссылку, которая вначале была передана функции, так что вызывающая функция в результате осуществляет прямой доступ к одной из собственных переменных.
Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.005 сек.) |