Ссылка и указатель на параметр функции - PullRequest
0 голосов
/ 28 января 2011

в моем коде у меня есть это:

void f1(Obj*x){
if(x==0){return;}
...
}

void f2(Obj&x){
...
f1(&x);
...
}

void f3(Obj*x){
...
f2(*x);
...
delete x;
}

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

лучше, если f2 тоже возьмет указатель?

Ответы [ 3 ]

0 голосов
/ 28 января 2011

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

f2 заставляет пользователяпередайте ненулевое значение, так что ссылка - хорошая идея.Предположительно, константно-корректно без какой-либо дополнительной информации, т. Е. F2 может изменить Obj, вызвав для него неконстантный метод.

Трудно понять, является ли дизайн хорошим с именами, такими как f1, f2 иf3.Иногда имена могут иметь все значение.Например, если имя f3 - «useAndDispose» или подобное, то для вызывающей функции ясно, что указатель будет удален после использования.

Аналогично, если ваша функция возвращает ресурс, который пользователь должен очиститьДа, имя, которое указывает на это (createSomething, а не getSomething), обычно предпочтительнее.

Даниэль сказал, что "обычно" вы не удаляете переданные вам указатели.Не "никогда", хотя.Эта функция, в частности, может быть функцией очистки или ситуацией рабочего процесса, когда что-то передается, а затем удаляется.

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

0 голосов
/ 28 января 2011

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

Проверьте это другие вопросы .

0 голосов
/ 28 января 2011

Используйте простой дизайн для интерфейса вашего класса.В частности, предпочитайте ссылки на указатели.

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

...