Читайте также:
|
|
C++ ссылки отличаются от указателей несколькими особенностями:
Невозможно ссылаться напрямую на объект ссылочного типа после его определения; каждое упоминание его имени ссылается напрямую на объект, на который он ссылается.
В качестве результата первого указания не могут быть выполнены ни какие-либо арифметические вычисления, ни приведение типов, ни любые другие операции, кроме копирования их связанных значений в другие ссылки.
После создания ссылки ее нельзя переделать в ссылку на другой объект; в таких случаях говорят, не может быть переопределена. Это часто делают с указателями.
Ссылки не могут быть null (т.е.указывать в никуда), тогда как указатели - могут; каждая ссылка ссылается на некий объект, вне зависимости от его корректности.
Ссылки не могут быть неинициализированными. Так как невозможно переинициализировать ссылку, она должна быть инициализирована сразу после создания. В частности, локальные и глобальные переменные должны быть проинициализированы там же, где они определены, а ссылки, которые являются данными-членами сущностей класса, должны быть инициализированы в списке инициализатора конструктора класса.
Пример:
int& k; // компилятор выдаст сообщение: ошибка: 'k' declared as reference but not initialized ('k' объявлена как ссылка, но не инициализирована)
Существует простое преобразование между указателями и ссылками: операция взятия адреса (&) получает указатель, ссылающийся на тот же самый объект при переходе по ссылке, а ссылка, которая инициализирована при разыменовании (*) указателя будет указывать на тот же объект, что и указатель, где это возможно без неопределенного поведения. Эта тождественность - отражение типичной реализации, которая весьма эффективно превращает ссылки в указатели, которые неявно разыменовываются при каждом использовании.
Как следствие - множество способов работы с переменными с автоматическим или статическим жизненным циклом по ссылке, несмотря на то, что синтаксически это похоже на прямой доступ, что может вызвать скрытую операцию разыменования.
Кроме того, из-за ограничения операций над ссылками, они намного легче в понимании, чем указатели, а также более защищены от ошибок. Тогда как указатели могут стать неправильными благодаря множеству способов, начинающихся с указания на null-значения и до использования недопустимых приведениях типов, ссылки могут стать некорректными лишь в двух случаях:
Если она ссылается на объект с автоматическим размещением в памяти, которое выходит за границы видимости,
Если она ссылается на объект, находящийся в блоке динамической памяти, который был освобожден.
Первый вариант легко обнаруживается автоматически если ссылка имеет статическую область видимости, но возникают проблемы, если ссылка - номер динамически размещенного объекта; от второго защищаться сложнее. Решение этих проблем лишь затрагивает тему ссылок, так как тут вопрос больше относится к политике управления памятью и размещением объектов.
Дата добавления: 2015-07-26; просмотров: 46 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Иерархия классов | | | Указатели |