Программирование >>  Дополнительные возможности наследования 

1 ... 69 70 71 [ 72 ] 73 74 75 ... 265


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:



1 ... 69 70 71 [ 72 ] 73 74 75 ... 265

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика