Вход/Регистрация
Программирование. Принципы и практика использования C++ Исправленное издание
вернуться

Страуструп Бьерн

Шрифт:

По крайней мере, оператор

static_cast
не позволяет преобразовать указатели в целые числа или аннулировать квалификатор
const
, поэтому при необходимости привести один тип к другому следует предпочесть оператор
static_cast
. Если вы пришли к выводу, что вам необходимо приведение типов, подумайте еще раз: нельзя ли написать программу иначе, без приведения типов? Можно ли переписать программу так, чтобы приведение типов стало ненужным? Если вам не приходится использовать код, написанный другими людьми, или управлять аппаратным обеспечением, то, безусловно, можно и нужно обойтись без оператора
static_cast
. В противном случае могут возникнуть трудноуловимые и опасные ошибки. Если вы используете оператор
reinterpret_cast
, то не следует ожидать, что ваша программа будет без проблем работать на другом компьютере.

17.9. Указатели и ссылки

Ссылку (reference) можно интерпретировать как автоматически разыменовываемый постоянный указатель или альтернативное имя объекта. Указатели и ссылки отличаются следующими особенностями.

• Присвоение чего-либо указателю изменяет значение указателя, а не объекта, на который он установлен.

• Для того чтобы получить указатель, как правило, необходимо использовать оператор

new
или
&
.

• Для доступа к объекту, на который установлен указатель, используются операторы

*
и
[]
.

• Присвоение ссылке нового значения изменяет значение объекта, на который она ссылается, а не саму ссылку.

• После инициализации ссылку невозможно установить на другой объект.

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

• Нулевые указатели представляют опасность.

Рассмотрим пример.

int x = 10;

int* p = &x; // для получения указателя нужен оператор &

*p = 7; // для присвоения значения переменной x

// через указатель p используется *

int x2 = *p; // считываем переменную x с помощью указателя p

int* p2 = &x2; // получаем указатель на другую переменную

// типа int

p2 = p; // указатели p2 и p ссылаются на переменную x

p = &x2; // указатель p ссылается на другой объект

Соответствующий пример, касающийся ссылок, приведен ниже.

int y = 10;

int& r = y; // символ & означает тип, а не инициализатор

r = 7; // присвоение значения переменной y

// с помощью ссылки r (оператор * не нужен)

int y2 = r; // считываем переменную y с помощью ссылки r

// (оператор * не нужен)

int& r2 = y2; // ссылка на другую переменную типа int

r2 = r; // значение переменной y присваивается

// переменной y2

r = &y2; // ошибка: нельзя изменить значение ссылки

// (нельзя присвоить переменную int* ссылке int&)

Обратите внимание на последний пример; это значит не только то, что эта конструкция неработоспособна, — после инициализации невозможно связать ссылку с другим объектом. Если вам нужно указать на другой объект, используйте указатель. Использование указателей описано в разделе 17.9.3.

Как ссылка, так и указатель основаны на адресации памяти, но предоставляют программисту разные возможности.

17.9.1. Указатели и ссылки как параметры функций

Если хотите изменить значение переменной на значение, вычисленное функцией, у вас есть три варианта. Рассмотрим пример.

int incr_v(int x) { return x+1; } // вычисляет и возвращает новое

// значение

void incr_p(int* p) { ++*p; } // передает указатель

// (разыменовывает его

// и увеличивает значение

// на единицу)

void incr_r(int& r) { ++r; } // передает ссылку

Какой выбор вы сделаете? Скорее всего, выберете возвращение значения (которое наиболее уязвимо к ошибкам).

int x = 2;

x = incr_v(x); // копируем x в incr_v; затем копируем результат

  • Читать дальше
  • 1
  • ...
  • 261
  • 262
  • 263
  • 264
  • 265
  • 266
  • 267
  • 268
  • 269
  • 270
  • 271
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: