Каким способом вы предпочитаете посылать аргументы? - PullRequest
1 голос
/ 23 февраля 2011

Предположим, у вас есть функция:

void fun(int *a, int *b);

Каким способом вы бы предпочли посылать аргументы?

(1.)

int x, y;
fun(&x, &y);

(2.)

int *x, *y;
fun(x, y);

Какие проблемы с другим способом или оба одинаковы и их поведение также будет одинаковым?

Ответы [ 6 ]

2 голосов
/ 23 февраля 2011

В C ++ мы обычно передаем объекты как ссылки. Это является преимуществом, поскольку меньше указателей на NULL.

Во втором примере кода вы передаете два неинициализированных int *, которые вызовут неопределенное поведение. Вы никогда не сможете присвоить *x или *y (технически это возможно, но это UB, и ваша программа может аварийно завершиться). Предпочитайте первый пример кода, поскольку вы указываете на реальные объекты.

2 голосов
/ 23 февраля 2011

Обычно вы используете первый, если вы хотите переменные в стеке, и второй, если вы выделяете память для них в куче. Стек обычно быстрее, а куча больше. Так что в целом вы используете первый шаблон довольно часто и используете его только при работе с гигантскими массивами или очень большими объектами.

1 голос
/ 23 февраля 2011

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

0 голосов
/ 23 февраля 2011

Я склонен согласиться с руководством Google по стилю c ++, где они запрашивают, чтобы входные параметры были ссылками на константы (const &), а выходные параметры - указателями.

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

Это дает пользователю немедленную очередь шаблоновчто параметр in (выше) является входным параметром, а out является выходным параметром.

0 голосов
/ 23 февраля 2011

В любом случае функциональность одинакова. В поведении нет никаких изменений.

Со вторым параметром, если x и y не инициализированы должным образом, существует область для ошибки сегментации.

0 голосов
/ 23 февраля 2011

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

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