The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Индекс форумов
Составление сообщения

Исходное сообщение
"Ссылки, константы, указалели... тонкий момент"
Отправлено jd2, 14-Ноя-08 01:12 
Ну, честно говоря, как это правильно произносится, я не задумывался - не вижу смысла в подобных упражнениях. А по поводу, почему так правильно, а так нет...

Итак, что мы имеем в вашем варианте (упростим немного для ясности):

int i = 5;
int* & refi = &i;

На что справедливо получаем:

test.cc:3: error: invalid initialization of non-const reference of type 'int*&' from a temporary of type 'int*'

А справедливо потому, что мы пытаемся инициализировать ссылку на несуществующий указатель. В том смысле, что переменной, содержащей указатель на int, на которую будет ссылаться наша ссылка, не существует. Компилятор создаёт в этом месте временную (?) переменную. Забыл, как это правильно называется - это примерно то же самое, что при возвращении значения из функции или при приведении типов в выражении. Второй вариант встречается, например, в случае такого кода:

int i;
double x;
... = i + x;

Здесь перед выполнением операции сложения, создаётся временная переменная типа double, в которую помещается приведённое к double значение i, а уже потом она складывается с x, после чего сразу уничтожается.

Так вот, то же самое происходит и в вашем случае! Ссылка должна ссылаться на переменную (константу), а соответствующей переменной (константы) не существует, поэтому компилятор создаёт временную. А так как в концепции C++ нет такого понятия, как автоматическая сборка мусора, то переменная должна быть явно уничтожена - либо после операции, в которой она используется (как в примере выше), либо когда закончится область видимости ссылки на эту временную переменную. Разумеется, "когда" здесь означает не время, а место.

А константной (!) ссылка должна быть потому, что будь она не константной, она могла бы в любой момент начать ссылаться на что-нибудь другое (простым присваиванием) и тогда наша временная переменная потерялась бы где-то в памяти, так как стало бы совершенно непонятно, когда её уничтожать (ведь сборки мусора в C++, как я уже говорил, нет). Фуф, примерно так. Путанно объяснил, потому как чукча не писатель... Точнее, писатель, но другого рода.

А вообще, лучше Страуструпа почитать. Всё-таки лучше источника информации по C++ нет.

 

Ваше сообщение
Имя*:
EMail:
Для отправки новых сообщений в текущей нити на email укажите знак ! перед адресом, например, [email protected] (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.

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



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру