Почему или в каких ситуациях вы передавали бы аргумент функции в качестве ссылки (или указателя) в C ++? - PullRequest
0 голосов
/ 21 сентября 2018

Я привык регулярно передавать аргументы в своем собственном коде, но часто натыкаюсь на аргументы функции, передаваемые по ссылке или указателю при чтении чужого кода C ++.Я не понимаю, какова цель этого.Может кто-нибудь объяснить это?

Ответы [ 5 ]

0 голосов
/ 21 сентября 2018

Передача по значению: когда мы не хотим изменять значение переменной из вызываемой функции.

Передача по ссылке: (только. В c ++, а не в c): когда мы хотим внести изменения в variabe с помощью вызываемой функции.

Передача по указателю: из periferi он работает так же, как и ссылка, но есть различия ..

0 голосов
/ 21 сентября 2018

Причины для этого включают в себя:

  • Мне нужно изменить переменную, которая не является локальной для вызываемой функции.
  • Я хочу передать одно слово функции,вместо того, чтобы делать копию большой структуры или массива (и, возможно, другого, если мне нужно изменить его).
  • Это указатель на разделяемую память, и я хочу, чтобы изменения были видны в разных процессах или потоках.
  • Это указатель на полиморфную структуру или объединение (или класс в C ++), и я хочу, чтобы функция могла определять правильный тип во время выполнения.
  • Размер и тип данных могут отличаться, как и в случае memcpy().
  • Тип должен быть непрозрачным для клиентского кода.
  • Вот так указывается интерфейс.
0 голосов
/ 21 сентября 2018

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

int square_this_number(int x)
{
    int y = 0;
    y = x * x;

    x = 1000;
    return y;
}

int a = 10;
int b = 0;

b = square_this_number(a);
/* a is still 10, not 1000. */
/* b is 100. */

Передача по ссылке или передача по указателю означает, что вы хотите сохранить изменение после завершения выполнения функции.

int try_square_and_change_input(int& x)
{
    int y = 0;
    y = x * x;

    x = 23;
    return y;
}

int a = 5;
int b = 0;

b = try_square_and_change_input(a);
/* a is now 23 instead of just 5. */
/* b is 25 of course. */

Вы можете обратиться к этой странице: https://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.3.0/com.ibm.zos.v2r3.cbclx01/cplr233.htm

0 голосов
/ 21 сентября 2018

По сути, для этого есть три причины.

Сокращение использования памяти

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

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

В этом случае следует использовать квалификатор const, чтобы указать, что переменная не будет изменена.

Изменитьаргумент

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

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

Низкоуровневый доступ к памяти

Все, что напрямую работает с памятью, будет хотеть прямогодоступ к указанной памяти.Стандартная практика на C, но менее распространенная на C ++.Посмотрите на функции, такие как memcpy() и что-нибудь еще от <string.h>.

0 голосов
/ 21 сентября 2018

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

Если, с другой стороны, вы сообщили функции адрес этой строки впамяти, он может изменить существующую строку без копирования.Иногда требуемые аргументы будут занимать тривиальный размер.В других случаях требуемые данные занимают несколько сотен мегабайт / гига / терабайт.Последнее, что вы хотите сделать, это прочитать все это, затем сделать копию, которую вы можете отправить в функцию.

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

...