|
Программирование >> Дополнительные возможности наследования
AucmuHZ B.I. Создание u использование ссылок 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Листинг 9.1. Пример использования ссылок ftinclude <iostream.h> int mainO { int intOne; int &rSomeRef = intOne; intOne = 5; cout intone: intOne endl; cout rSomeRef: rSomeRef endl; rSomeRef = 7; cout << intOne: << intOne << endl; cout rSomeRef: rSomeRef endl; return 0; intOne: 5 rSomeRef: 5 intOne: 7 rSomeRef: 7 В строке 8 объявляется локальная целочисленная переменная mtOne, а в строке 9 - ссылка rSomoRef на некоторое целое значение, инициализируемая адресом переменной mtOne. Если объявить ссылку, но не инициализировать ее, будет сгенерирована ошибка компиляции. Ссылки, в отличие от указателя, необходимо инициализировать при объявлении. В строке 11 переменной intOne присваивается значение 5. В строках 12 и 13 выводятся на экран значения переменной intOne и ссылки rSomeRef,- они, конечно же, оказываются одинаковыми. В строке 15 ссылке rSomeRef присваивается значение 7. Поскольку мы имеем дело со ссылкой, а она является псевдонимом для переменной intOne, то число 7 в действительности присваивается переменной intOne, что и подтверждается выводом на экран в строках 16 и 17. Использование пператпра аурвса (& при рабптв сп ссылками Если использовать ссылку для получения адреса, она вернет адрес своего адресата. В этом и состоит природа ссылок. Они являются псевдонимами для своих адресатов. Именно это свойство и демонстрирует листинг 9.2. Апстинг 9.Z. Взятие адреса ссылки 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Листинг 9.2, Пример использования ссылок ftinclude <iostream.h> int main() { int intOrie; int &rSoneRef = intOne; intOne - 5; cout mtOne: intOne endl; cout << rSomeRef: << rSomeRef << endl; cout &int0ne: &int0ne endl; cout &rSomeRef: &rSomeRef endl; return 0; } intOne: 5 rSomeRef: 5 ScintOne- 0x3500 &rSomeRef 0x3500 примечание Результаты работы программы на вашем компьютере могут отличаться от приведенных в последних двух строках. И вновь-таки ссылка rSomeRef инициализируется адресом переменной intOno. На этот раз выводятся адреса двух переменных, и они оказываются идентичными. В языке С++ не предусмотрено предоставление доступа к адресу самой ссылки, поскольку в этом нет смысла. С таким же успехом для этого можно было бы использовать указатель или другую переменную. Ссылки инициализируются при создании, и они всегда действуют как синонимы для своих адресатов, даже в том случае, когда применяется оператор адреса. Например, если у вас есть класс с именем City, вы могли бы объявить объект этого класса следующим образом: City boston; Затем можно объявить ссылку на некоторый объект класса City и инициализировать ее, используя данный конкретный объект: City &beanTown - boston; Существует только один класс City; оба идентификатора ссылаются на один и тот же объект одного и того же класса. Любое действие, которое вы предпримите относительно ссылки beariTown, будет выполнено также и над объектом boston. Обратите вни.мание на различие между символом & в строке 9 листинга 9.2, который объявляет ссылку rSomeRef на значение типа int, и символами & в строках 15 и 16, которые возвращают адреса целочисленной переменной intOne и ссылки rSomeRef. Обычно для ссылки оператор адреса не используется. Мы просто используем ссылку вместо связанной с ней переменной, как показано в строке 13. Ссылки нельзя переназначать Даже опытных программистов, которые хорошо знают правило о том, что ссылки нельзя переназначать и что они всегда являются псевдонимами для своих адресатов, может ввести в заблуждение происходящее при попытке переназначить ссылку. То, что кажется переназначением, оказывается присвоением нового значения адресату. Этот факт иллюстрируется в листинге 9.3. Апстпнг У.З. ПрисвоЕнне значения ссылке 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 Листиш 9.3. Присвоение значения ссылке #include <iostroan,h> int пазпО { int intOne; int &rSoneRef = intOne; intOne = 5; cout << ]ntOne:\ f intOne << endl; cout << rSomeRef:\ t rSomeRof << endl; cout &intOne;\ t &intOne << endl; cout &rSomoRef:\ t << &rSuneRof endl; int IntTwo - 8; rSomeRef = intTwo; не то ч.о вы думаете! cout cout << cout cout cout << cout return 0 \ nint0ne:\ t intOne endl; intTwo:\ t << intTwo << endl; rSomeRef;\ t rSomeRef endl: 8.int0ne:\ t &int0ne endl; &iiitTwo:\ t SiintTwo endl: &rSomeRef:\ t &rSomeRnf endl:
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |