Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Связь с указателями

Читайте также:
  1. IY. СОВРЕМЕННАЯ КОНЦЕПЦИЯ МЕДИЦИНЫ КАТАСТРОФ И ЕЕ ВЗАИМОСВЯЗЬ С ВОЕННОЙ МЕДИЦИНОЙ.
  2. А 18. Взаимосвязь углеводородов и кислородсодержащих органических соединений
  3. А18. Взаимосвязь органических веществ.
  4. Билет 29. Теория диа- и парамагнетизма. Магнитная восприимчивость вещества и ее зависимость от температуры, ее связь с магнитной проницаемостью
  5. Будем полагаться на мою внутреннюю связь с Пламенем Чистоты. Она усилилась, мы уже почти у цели!
  6. В) Связь для обеспечения безопасности
  7. Взаимосвязь духа и секса

C++ ссылки отличаются от указателей несколькими особенностями:

Невозможно ссылаться напрямую на объект ссылочного типа после его определения; каждое упоминание его имени ссылается напрямую на объект, на который он ссылается.

В качестве результата первого указания не могут быть выполнены ни какие-либо арифметические вычисления, ни приведение типов, ни любые другие операции, кроме копирования их связанных значений в другие ссылки.

После создания ссылки ее нельзя переделать в ссылку на другой объект; в таких случаях говорят, не может быть переопределена. Это часто делают с указателями.

Ссылки не могут быть null (т.е.указывать в никуда), тогда как указатели - могут; каждая ссылка ссылается на некий объект, вне зависимости от его корректности.

Ссылки не могут быть неинициализированными. Так как невозможно переинициализировать ссылку, она должна быть инициализирована сразу после создания. В частности, локальные и глобальные переменные должны быть проинициализированы там же, где они определены, а ссылки, которые являются данными-членами сущностей класса, должны быть инициализированы в списке инициализатора конструктора класса.

Пример:

int& k; // компилятор выдаст сообщение: ошибка: 'k' declared as reference but not initialized ('k' объявлена как ссылка, но не инициализирована)

Существует простое преобразование между указателями и ссылками: операция взятия адреса (&) получает указатель, ссылающийся на тот же самый объект при переходе по ссылке, а ссылка, которая инициализирована при разыменовании (*) указателя будет указывать на тот же объект, что и указатель, где это возможно без неопределенного поведения. Эта тождественность - отражение типичной реализации, которая весьма эффективно превращает ссылки в указатели, которые неявно разыменовываются при каждом использовании.

Как следствие - множество способов работы с переменными с автоматическим или статическим жизненным циклом по ссылке, несмотря на то, что синтаксически это похоже на прямой доступ, что может вызвать скрытую операцию разыменования.

Кроме того, из-за ограничения операций над ссылками, они намного легче в понимании, чем указатели, а также более защищены от ошибок. Тогда как указатели могут стать неправильными благодаря множеству способов, начинающихся с указания на null-значения и до использования недопустимых приведениях типов, ссылки могут стать некорректными лишь в двух случаях:

Если она ссылается на объект с автоматическим размещением в памяти, которое выходит за границы видимости,

Если она ссылается на объект, находящийся в блоке динамической памяти, который был освобожден.

Первый вариант легко обнаруживается автоматически если ссылка имеет статическую область видимости, но возникают проблемы, если ссылка - номер динамически размещенного объекта; от второго защищаться сложнее. Решение этих проблем лишь затрагивает тему ссылок, так как тут вопрос больше относится к политике управления памятью и размещением объектов.


Дата добавления: 2015-07-26; просмотров: 46 | Нарушение авторских прав


Читайте в этой же книге: Функция gets(). 4 страница | Функция gets(). 5 страница | Функция gets(). 6 страница | Функция gets(). 7 страница | Целый тип данных | Указатели | Инициализация данных | Структуры | Синтаксис описания шаблона | Полиморфизм |
<== предыдущая страница | следующая страница ==>
Иерархия классов| Указатели

mybiblioteka.su - 2015-2024 год. (0.005 сек.)