Что хороший путь состоит в том, чтобы думать о ссылках C++?

SQL Server 2005 вперед:

IF EXISTS(SELECT 1 FROM sys.columns 
          WHERE Name = N'columnName'
          AND Object_ID = Object_ID(N'schemaName.tableName'))
BEGIN
    -- Column Exists
END

версия Martin Smith короче:

IF COL_LENGTH('schemaName.tableName', 'columnName') IS NOT NULL
BEGIN
    -- Column Exists
END
7
задан Community 23 May 2017 в 12:25
поделиться

12 ответов

Я привык думать о ссылках как о псевдониме для основного объекта.

РЕДАКТИРОВАТЬ (из-за запроса в комментариях):

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

12
ответ дан 6 December 2019 в 05:01
поделиться

На мой взгляд, когда я вижу указатель в коде (как локальную переменную в функции или члене класса), я должен думать о

  1. Является ли указатель нулевым или действительно ли это
  2. Кто создал объект, на который он указывает (это я? Я уже это сделал?)
  3. Кто отвечает за удаление объект
  4. Всегда ли он указывает на одно и то же объект

Мне не нужно думать ни о чем из этого, если это ссылка, это чья-то проблема (т.е. воспринимайте ссылку как поле SEP для указателя)

PS Да , это, вероятно, все еще моя проблема, только не сейчас

8
ответ дан 6 December 2019 в 05:01
поделиться

Я не слишком люблю "вечно действительное" представление, поскольку ссылки могут стать недействительными, например

int* p = new int(100);
int& ref = *p;

delete p; // oops - ref now references garbage

Итак, я считаю ссылки не подлежащими повторному связыванию (то есть вы не можете изменить цель ссылки после ее инициализации ) указатели с синтаксическим сахаром, чтобы помочь мне избавиться от синтаксиса указателя "->".

6
ответ дан 6 December 2019 в 05:01
поделиться

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

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

5
ответ дан 6 December 2019 в 05:01
поделиться

Ссылки представляют собой константы указателя с другим синтаксисом. т.е. ссылка T & в значительной степени T * const как и в, указатель не может быть изменен. Содержание обоих идентично - адрес памяти T - и ни один из них не может быть изменен.

Кроме того, в значительной степени единственная разница заключается в синтаксисе:. для ссылок и -> и * для указателя.

Вот и все - ссылки на указатели ARE, только с другим синтаксисом (и они const).

3
ответ дан 6 December 2019 в 05:01
поделиться

Как насчет «указателей, которые не могут иметь значение NULL и не могут быть изменены после инициализации». Кроме того, они не имеют размера сами по себе (потому что они не идентичны сами по себе).

2
ответ дан 6 December 2019 в 05:01
поделиться

Я думаю, что ссылка - это объект, на который она ссылается. Вы получаете доступ к объекту, используя. symantecs (в отличие от ->), усиливая эту идею для меня.

2
ответ дан 6 December 2019 в 05:01
поделиться

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

Те, у кого нет указателей, будут дела обстоят гораздо хуже.

Между прочим, они могут быть NULL или любой другой недоступной ячейкой памяти (это просто требует усилий):

char* test = "aha";
char& ok = *test;
test = NULL;
char& bad = *test;
2
ответ дан 6 December 2019 в 05:01
поделиться

Один из способов думать о них - это импортировать другое имя для объекта из, возможно, другой области.

Например: Obj o; Obj & r = o; На самом деле существует небольшая разница между семантикой o и r.

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

1
ответ дан 6 December 2019 в 05:01
поделиться

Я думаю об этом как о контейнере указателя.

0
ответ дан 6 December 2019 в 05:01
поделиться

Если вы используете Linux, вы можете думать о ссылках как о жестких ссылках, а указатели как о символических ссылках (символических ссылках). Жесткая ссылка - это просто еще одно название файла. Файл "удаляется", когда все жесткие ссылки на этот файл удаляются.

То же самое и со ссылками. Просто замените «жесткую ссылку» на «ссылку» и «файл» на «значение» (или, возможно, «место в памяти»?).

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

Можно ' t создать жесткую ссылку на несуществующий файл. Точно так же невозможно создать ссылку ни на что.

Однако вы можете создать символическую ссылку на несуществующий файл. Очень похоже на неинициализированный указатель. На самом деле неинициализированные указатели указывают на некоторые случайные места (поправьте меня, если я ошибаюсь). Но я имею в виду, что вы не должны их использовать :)

0
ответ дан 6 December 2019 в 05:01
поделиться

Из синтаксической точки обзора ссылка - это псевдоним для существующего объекта. С семантической точки зрения ссылка ведет себя как указатель с удалением нескольких проблем (признание недействительности, владение и т. Д.) И добавлением объектно-подобного синтаксиса. С практической точки зрения предпочтите ссылки, если вам не нужно говорить «нет объекта». (Владение ресурсами не является причиной для предпочтения указателей, поскольку это должно быть сделано с использованием интеллектуальных указателей.)

Обновление : Вот еще одно различие между ссылками и указателями, о котором я забыл: временный объект (rvalue) привязанная к константной ссылке, время жизни будет увеличено до срока жизни ссылки:

const std::string& result = function_returning_a_string();

Здесь временное значение, возвращаемое функцией, привязано к результату и не прекратит свое существование в конце выражение, но будет существовать до тех пор, пока не умрет результат . Это хорошо, потому что в отсутствие ссылок на rvalue и перегрузки на их основе (как в C ++ 11) это позволяет избавиться от одной ненужной копии в приведенном выше примере.

Это правило введено специально для константные ссылки, и с помощью указателей этого не добиться.

0
ответ дан 6 December 2019 в 05:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: