лучшая практика для параметров? - PullRequest
5 голосов
/ 13 октября 2011

Обычно считается, что лучше передавать параметры как указатели, а не как значения, когда это возможно? Очевидно, это во многом зависит от ситуации, но когда есть выбор, лучше ли использовать указатели?

Это просто из соображений памяти?

А что лучше пройти, если это правда, указатель или ссылка?

Ответы [ 5 ]

7 голосов
/ 13 октября 2011

Некоторые общие правила:

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

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

Если вы используете указатели, предпочитайте умные указатели голым указателям.

В противном случае передать по значению.

1 голос
/ 13 октября 2011

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

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

0 голосов
/ 13 октября 2011

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

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

Конечно, формируйте маленькие типы, такие как int, long и т. Д. Я не беспокоюсь о ссылках.

0 голосов
/ 13 октября 2011

Это зависит от того, какой тип параметра вы передаете.Если размер параметра равен разумно (опять же, решено вами) низко, вы можете перейти по значению.

Для структур / массивов большого размера всегда рекомендуется проходить указатель или ссылка .Кроме того, если параметр не должен быть изменяемым, вы также можете добавить const.

0 голосов
/ 13 октября 2011

Лучше всего, чтобы НИКОГДА не передавал указатель.

  1. Передавайте по константной ссылке, чтобы избежать затрат на копирование.

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

  3. В противном случае передайте по значению.

  4. Указатели никогда не должны проходить мимов RAW (без семантики владения)
    Указатели никогда не должны храниться вне интеллектуального указателя или класса контейнера.

  5. Только если объект потенциально может иметь значение NULL и владение явно непередано (с помощью большого количества документации), если вы когда-либо передадите указатель.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...