Топ контрибуторов
loading
loading
Знаете ли Вы, что

Если у вас есть уникальная статья и вы хотите, чтобы она стала достоянием общественности, вы можете разместить ее на Quizful.

Лента обновлений
ссылка 14:57:26
Комментарий от sashka228:
согласна
ссылка 14:56:54
Комментарий от sashka228:
#ресоурсескотився
ссылка 14:54:17
Комментарий от sashka228:
yep.
ссылка 14:12:03
Добавлен вопрос в тест C++ - Средний уровень
ссылка 14:00:35
Комментарий от Anton_2015:
Гарне питання
Статистика

Тестов: 153, вопросов: 8596. Пройдено: 445771 / 2188313.

Передача параметров по значению. За и Против.

head tail Статья
категория
C++
дата19.07.2013
авторLintyai
голосов12
    В языке программирования С++ существует три режима передачи данных: по значению, по указателю, по ссылке.  

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

int a, b;

Function_1 (a, b);   // переменные встроенных типов

Function_2 (a + 34, b*b); // выражение

Function_3 (884);       // литеральные значения


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

#include <iostream>

 

void func_1 (int value) {

       value *= value;

       std::value << value << std::endl;  // value равно 4

}

 

int main() {

       int value = 2;

       func_1 (value);

       std::cout << value << std::endl;

// value в коде клиента не изменил своего значения

// и остался равным 2

}


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

#include <iostream>

 

int func_1 (int value) {

       value *= value;

       return value;

}

 

int main() {

       int value = 2;

       value = func_1 (value);

       std::cout << value << std::endl;

// value в коде клиента изменил своего значения

// и стал равным 4

}                                      


   Когда функция не изменяет значений своих параметров встроенных типов С++, лучше передавать параметры по значению, если конечно клиенту не нужно сверхскоростную обработку данных (на копирование параметров в стек нужно некоторое время). Кстати, при передаче параметров по значению возникает возможность переполнения стека, поэтому лучшей альтернативой все-таки является передача параметров по ссылке. Для того чтобы передать информацию клиенту о том, будет ли изменяться параметр или нет – нужно объявить его ключевым словом "const": 

void  func_1(const int&   value);  //зпередаваемый параметр value не меняется

void   func_2(int&   value);  //зпередаваемый параметр value меняется

 

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

Если Вам понравилась статья, проголосуйте за нее

Голосов: 12  loading...
pomahax   HRtest   Feanor10   gkar   r1ck0   lupus   invulnerabl__   Gurbych   kirill1994   Staller   Nadya2308   d5_kuchina