Вопрос

Возможный Дубликат:
Разница между переменной указателя и ссылочной переменной в C ++

Когда я должен объявлять свои переменные как указатели по сравнению с объектами, передаваемыми по ссылке?Они компилируются в одно и то же в ассемблере (по крайней мере, во время выполнения асимптотически), так что когда я должен что-то использовать?

void foo(obj* param)
void foo(obj& param)
Это было полезно?

Решение

Мое правило простое:используйте *, когда вы хотите показать, что значение является необязательным и, следовательно, может быть равно 0.

Исключение из правила:все _obj_s хранятся в контейнерах, и вы не хотите, чтобы ваш код выглядел уродливо, используя everywhere foo(*value); вместо того , чтобы foo(value); Итак, чтобы показать, что значение не может быть равно 0, поместите assert(value); в начале функции.

Другие советы

Я следую за Стандарт руководства по стилю Google поскольку для меня это имеет наибольший смысл.В нем говорится:

В списке параметров функции перечислены все ссылки должны быть const:

void Foo(const string &in, string *out);

На самом деле это очень строгое соглашение в Google code входные аргументы являются значениями или постоянными ссылками, в то время как выходные аргументы являются указателями.Ввод параметры могут быть постоянными указателями, но мы никогда не допускаем неконстантные ссылки параметры.

Один из случаев, когда вы можете захотеть, чтобы входным параметром был указатель const, - это если вы хотите подчеркнуть, что аргумент не копируется, поэтому он должен существовать в течение всего срока службы объекта;обычно лучше всего документировать это в также в комментариях.Адаптеры STL, такие как bind2nd и mem_fun, не разрешают ссылаться на параметры, поэтому вы должны объявлять функции с указателем параметры в этих случаях тоже.

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

(Однако, выполняя сложные действия, все еще возможно передать значение NULL в ссылочный параметр.Вы можете ожидать, что в этом случае вызываемая функция может выйти из строя.)

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

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

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

То же самое относится к "0" или "NULL".Я предпочитаю использовать "NULL", таким образом, 3 месяца спустя, когда я вижу код, который выглядит как:

somevar_1 = 0;
somevar_2 = NULL;

Я знаю, что somevar_1 является int (или float) и somevar_2 это какой-то указатель.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top