Читайте также:
|
|
В конце прошлой лекции мы обсуждали понятие ссылки в контексте применения ссылок в функциях. Напомним и продолжим эту тему.
Agrave; Справка: “Тип” ссылка
Ссылочная переменная, или просто ссылка, есть альтернативное имя, псевдоним (синоним, алиас – alias) другой, уже существующей, переменной, т.е., определяя переменную типа ссылка, мы определяем для некоторой переменной другое имя. Ссылки должны быть инициализированы при объявлении. Инициализатор является именующим выражением (l-value), которое дает адрес переменной. Когда объявляется переменная i, она получает связанный с ней адрес памяти. Когда объявляется переменная-ссылка j и инициализируется переменной i, она идентична i, в том смысле, что ничем не отличается от остальных имен этого объекта. Инициализация ссылки не есть присвоение ей значения – несмотря на форму записи, ни один оператор не выполняет действий над ссылкой.
int i;
int& j = i; // j и i два имени для одной и той же переменной
j = 2; // i принимает значение 2
Ссылки часто используются как параметры функций или для возвращения значений из функций.
Ссылка может иметь константный тип. Инициализатор для const T& не обязан быть lvalue и даже иметь тип T. Константная ссылка может ссылаться на неконстантную переменную. В этом случае, переменная имеет два имени: одно есть константное имя, другое – неконстантное. Эта переменная не может быть модифицирована через константное имя:
int i = 3;
const int & n = i;
i = 5; // OK
//n = 7; не разрешено
ß
Использование Ссылок
Ссылка во многих отношениях похожа на указатели, которые мы уже обсуждали, но ссылка – это, в сущности, совершенно иной объект. Реальная значимость ссылок проявится при обсуждении их использования в функциях, и, в частности, в контексте ООП. Не нужно заблуждаться при виде их внешней простоты и кажущейся тривиальности самой концепции ссылки. Как мы увидим позже, ссылки обеспечивают некоторые экстраординарные возможности, а в некоторых контекстах, позволяют достичь результатов, невозможных без их применения.
Итак, ссылка – это вымышленное (alias – псевдоним) имя для другой переменной. Это имя может использоваться вместо имени оригинальной переменной. Так как это псевдоним, а не указатель, то переменная, для которой вводится псевдоним (т.е., ссылка) должна быть специфицирована при объявлении ссылки, и, в отличие от указателя, ссылку нельзя изменить так, чтобы она представляла другую (“чужую”) переменную.
Объявление и инициализация ссылок
Если мы имеем объявленную переменную,
long number = 0;мы можем объявить ссылку на эту переменную, используя следующий оператор объявления:
long& rnumber = number; // Объявление ссылки на переменную numberАмперсанд вслед за типом long и последующее имя rnumber, указывают, что объявлена ссылка и переменная, которую она представляет, есть number, которая специфицирована в качестве инициализирующего значения после знака равенства. Поэтому, rnumber имеет тип 'ссылка на long'. Теперь ссылка может использоваться вместо имени исходной переменной. Например, такой оператор,
rnumber += 10;действует как увеличение значения переменной number на 10.
Для сравнения рассмотрим указатель pnumber, объявленный в операторе:
long* pnumber = &number; // Initialize a pointer with an addressЗдесь объявлен указатель pnumber, и он инициализирован адресом переменной number. Это позволяет применить указатель при инкрементировании в таком виде:
*pnumber += 10; // Увеличение number с использованием указателяМы видим важную разницу между использованием указателей и ссылок. Указатель нуждается в операции разыменования, чтобы по содержащемуся в указателе адресу можно было “добраться” до значения переменной. При наличии ссылки же у нас нет необходимости в разадресации. В некотором смысле, ссылка похожа на указатель, который уже (всегда) разыменован, хотя он не может быть изменен для ссылки на не свою переменную. Ссылка – это полный эквивалент другой переменной, для которой она введена, и может рассматриваться как альтернативная нотация заданной переменной и ведет себя соответственно. Но мы увидим, при обсуждении использования ссылок в функциях, что это не вся правда о ссылках.
Дата добавления: 2015-11-16; просмотров: 50 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Проверка – Передача по значению | | | Как это работает |