Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 4. Как сделать так, чтобы вас уважали и ценили?
Как сделать лучше себе и другим людям
Как сделать свидание интересным?
Категории:
АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника
|
Листинг 7.1. Передача аргумента по значениюСтр 1 из 5Следующая ⇒ Лабораторная работа 7. Подробнее о функциях
Цели, достигаемые в этой работе 1. Освоить два подхода к передаче аргументов 2. Научиться создавать рекурсивные функции 3. Познакомиться с понятием перегрузки функций 4. Научиться создавать шаблоны функций
Два подхода к передаче аргументов
В С++ существует два механизма передачи аргументов функциям: по значению и через ссылку. При передаче аргумента функции по значению при вызове функции для переменных, которые указаны ее аргументами, создаются копии, которые фактически и передаются функции. После завершения выполнения кода функции эти копии уничтожаются (выгружаются из памяти). При передаче аргументов функции по ссылке функция получает непосредственный доступ (через ссылку) к переменным, указанным аргументами функции. С практической точки зрения разница между этими механизмами заключается в том, что при передаче аргументов по значению изменить передаваемые функции аргументы в теле самой функции нельзя, а при передаче аргументов по ссылке - можно. По умолчанию используется механизм передачи аргументов функции по значению. Проиллюстрируем сказанное на конкретных примерах.
1. Пример передачи аргументов по значению
Рассмотрим программный код, приведенный в листинге 7.1.
Листинг 7.1. Передача аргумента по значению
// demoVar.cpp: Defines the entry point for the console application. //
#include "stdafx.h" #include <iostream> using namespace std;
//Аргумент передается по значению: int incr (int m);
int main() { int n=5; cout << "n =" << incr (n) << endl; cout << "n =" << n << endl;
cin >> n; return 0; }
int incr (int m) { m=m+1; return m; }
Программный код функции incr () предельно прост: функция в качестве значения возвращает целочисленную величину, на единицу превышающую аргумент функции. Особенность программного кода состоит в том, что в теле функции выполняется команда m=m+1, которой с формальной точки зрения аргумент функции т увеличивается на единицу, и именно это значение возвращается в качестве результата. Поэтому с точки зрения здравой логики после вызова функции переменная, переданная ей в качестве аргумента, должна увеличиться на единицу. Однако это не так. Вывод результатов выполнения программы на экран будет выглядеть так: n =6 n =5 Если с первой строкой проблем не возникает, то вторая выглядит несколько неожиданно. Хотя это только на первый взгляд. Остановимся подробнее на том, что происходит при выполнении программы. В начале главного метода main () инициализируется со значением 5 целочисленная переменная n. Далее на экран выводится результат вычисления выражения incr (n) и затем значение переменной n. Поскольку функция incr () возвращает значение, на единицу большее аргумента, результат этого выражения равен 6. Но почему же тогда не меняется переменная n? Все дело в механизме передачи аргумента функции. Поскольку аргумент передается по значению, при выполнении инструкции incr (n) для переменной n автоматически создается копия, которая и передается аргументом функции incr (). В соответствии с кодом функции значение переменной-копии увеличивается на единицу и полученное значение возвращается в качестве результата функции. Как только результат функцией возвращен, переменная-копия прекращает свое существование. Поэтому функция вычисляется корректно, а переменная-аргумент не меняется!
2. Пример передачи аргументов по ссылке Для того чтобы аргумент передавался не по значению, а по ссылке, перед именем соответствующего аргумента необходимо указать оператор &. В листинге 7.2 приведен практически тот же программный код, что и в листинге 7.1, однако аргумент функции incr () в этом случае передается по ссылке.
|