C++ * по сравнению с и в объявлении функции [дубликат]

Для диаграмм последовательности можно также попробовать Средство моделирования Трассировки . Это не свободно, но это имеет большой интерфейс, очень дружественный и продуктивный. Можно использовать его на любой платформе.

10
задан Community 23 May 2017 в 11:46
поделиться

5 ответов

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

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

13
ответ дан 3 December 2019 в 16:54
поделиться

Я следую стандарту руководства по стилю Google , так как он мне наиболее понятен. В нем говорится:

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

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

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

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

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

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

2
ответ дан 3 December 2019 в 16:54
поделиться

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

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

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

3
ответ дан 3 December 2019 в 16:54
поделиться

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

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

somevar_1 = 0;
somevar_2 = NULL;

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

0
ответ дан 3 December 2019 в 16:54
поделиться
Другие вопросы по тегам:

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