Главная страница Случайная страница Разделы сайта АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Ссылки нельзя переназначать
Даже опытных программистов, которые хорошо знают правило о том, что ссылки нельзя переназначать и что они всегда являются псевдонимами для своих адресатов, может ввести в заблуждение происходящее при попытке переназначить ссылку. То, что кажется переназначением, оказывается присвоением нового значения адресату. Этот факт иллюстрируется в листинге 9.3. Листинг 9.3. Присвоение значения ссылке 1: // Листинг 9.3 2: // Присвоение значения ссылке 3: 4: #include < iostream.h> 5: 6: int main() 7: { 8: int intOne; 9: int & rSomeRef = intOne; 10: 11: intOne: 5 12: cout < < " intOne: \t" < < intOne < < endl; 13: cout < < " rSomeRef: \t" < < rSomeRef < < endl; 14: cout < < " & intOne: \t" < < & intOne < < endl; 15: cout < < " & rSomeRef: \t" < < & rSomeRef < < endl; 16: 17: int intTwo = 8; 18: rSomeRef = intTwo; // не то что вы думаете 19: cout < < " \nintOne: \t" < < intOne < < endl; 20: cout < < " intTwo: \t" < < intTwo < < endl; 21: cout < < " rSomeRef: \t" < < rSomeRef < < endl; 22: cout < < " & intOne: \t" < < & intOne < < endl; 23: cout < < " & intTwo: \t" < < & intTwo < < endl; 24: cout < < " & rSomeRef: \t" < < & rSomeRef < < endl; 25: return 0; 26: }
Результат: intOne: 5 rSomeRef: 5 & intOne: 0x213e & rSomeRef: 0x213e intOne: 8 int: Two: 8 rSomeRef: 8 & intOne: 0x213e & intTwo: 0x2130 & rSomeRef: 0x213e
Анализ: Вновь в строках 8 и 9 объявляются целочисленная переменная и ссылка на целое значение. В строке 11 целочисленной переменной присваивается значение 5, а в строках 12-15 выводятся значения переменной и ссылки, а также их адреса. В строке 17 создается новая переменная intTwo, которая тут же инициализируется значением 8. В строке 18 программист пытается переназначить ссылку rSomeRef так, чтобы она стала псевдонимом переменной intTwo, но этого не происходит. На самом же деле ссылка rSomeRef продолжает действовать как псевдоним переменной intOne, поэтому такое присвоение эквивалентно следующей операции: intOne = intTwo; Это кажется достаточно убедительным, особенно при выводе на экран значений переменной intOne и ссылки rSomeRef (строки 19— 21): их значения совпадают со значением переменной intTwo. На самом деле при выводе на экран адресов в строках 22—24 вы видите, что ссылка rSomeRef продолжает ссылаться на переменную intOne, а не на переменную intTwo.
Не рекомендуется: Не пытайтесь переназначить ссылку. Не путайте оператор адреса с оператором ссылки. Рекомендуется: Используйте ссылки для создания псевдонимов объектов. Инициализируйте ссылки при объявлении.
|