В чем разница между передачей по ссылке и передачей по значению? - PullRequest
512 голосов
/ 17 декабря 2008

В чем разница между

  1. параметр, переданный по ссылке
  2. параметр, передаваемый по значению?

Не могли бы вы привести несколько примеров, пожалуйста?

Ответы [ 15 ]

3 голосов
/ 17 декабря 2008

Примеры:

class Dog 
{ 
public:
    barkAt( const std::string& pOtherDog ); // const reference
    barkAt( std::string pOtherDog ); // value
};

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

2 голосов
/ 27 июля 2014

Короче говоря, Passed by value - это то, ЧТО это и передается по ссылке, ГДЕ это.

Если ваше значение VAR1 = «Счастливый парень!», Вы увидите только «Счастливый парень!». Если VAR1 изменится на «Happy Gal!», Вы об этом не узнаете. Если он передается по ссылке, а VAR1 изменяется, вы это сделаете.

1 голос
/ 12 июня 2013

передача по значению означает, как передать значение в функцию, используя аргументы. при передаче по значению мы копируем данные, хранящиеся в указанной переменной, и это медленнее, чем передача по ссылке bcse t Данные копируются. Мы вносим изменения в скопированные данные, исходные данные не затрагиваются. При передаче по ссылке или по адресу мы отправляем прямую ссылку на саму переменную. или передавая указатель на переменную. это быстрее, потому что меньше времени потребляется

1 голос
/ 24 января 2011

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

Тогда функция будет иметь ТОЛЬКО значение, но не адрес переданной переменной. Без адреса переменной код внутри функции не может изменить значение переменной, как видно снаружи функции.

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

0 голосов
/ 25 апреля 2015

Вот пример, который демонстрирует различия между передачей по значению - значением указателя - ссылкой :

void swap_by_value(int a, int b){
    int temp;

    temp = a;
    a = b;
    b = temp;
}   
void swap_by_pointer(int *a, int *b){
    int temp;

    temp = *a;
    *a = *b;
    *b = temp;
}    
void swap_by_reference(int &a, int &b){
    int temp;

    temp = a;
    a = b;
    b = temp;
}

int main(void){
    int arg1 = 1, arg2 = 2;

    swap_by_value(arg1, arg2);
    cout << arg1 << " " << arg2 << endl;    //prints 1 2

    swap_by_pointer(&arg1, &arg2);
    cout << arg1 << " " << arg2 << endl;    //prints 2 1

    arg1 = 1;                               //reset values
    arg2 = 2;
    swap_by_reference(arg1, arg2);
    cout << arg1 << " " << arg2 << endl;    //prints 2 1
}

Метод «передачи по ссылке» имеет важное ограничение . Если параметр объявлен как , переданный по ссылке (поэтому ему предшествует знак &), соответствующий ему фактический параметр должен быть переменной .

Фактическим параметром, относящимся к формальному параметру «передано по значению», может быть выражение в целом, поэтому допускается использование не только переменной, но также литерала или даже результата вызова функции. 1016 *

Функция не может поместить значение во что-либо, кроме переменной. Он не может присвоить литералу новое значение или заставить выражение изменить его результат.

PS: Вы также можете проверить ответ Дилана Битти в текущей ветке, который объясняет его простыми словами.

...