Смущает вопрос из книги Лафоре "ООП в С++"
В книге Роберта Лафоре в 5 главе столкнулся с интересным 18 вопросом. Вот как он звучит:
Когда аргумент передается в функцию по ссылке,
а) внутри функции создаётся переменная, хранящая значение этого аргумента;
б) функция не имеет доступа к значению аргумента;
в) в вызывающей программе создаётся временная переменная для хранения значения аргумента;
г) функция получает доступ к аргументу в вызывающей программе.
Я выбрал ответ а, потому что, как сказал автор:
Как мы видели, функция не имеет доступа к переменным аргументам, а работает со сделанными ей копиями.
а также
Важной особенностью передачи аргументов по ссылке является то, что функция имеет прямой доступ к значениям аргументов.
Но что ввело меня в полнейший ступор, так это то, что правильный ответ - г. Здесь есть какая-то тонкость или я что-то упустил?
Ответы (2 шт):
Как мы видели, функция не имеет доступа к переменным аргументам, а работает со сделанными ей копиями.
Это при передаче аргументов по значению (не по указателю, не по ссылке).
Важной особенностью передачи аргументов по ссылке является то, что функция имеет прямой доступ к значениям аргументов.
Это при передаче аргументов по ссылке или по указателю.
Именно из второй цитаты следует, что правильный ответ Г). Функция имеет прямой доступ к значениям аргументов, которые хранятся в теле вызывающей функции. То есть может их как читать, так и перезаписывать.
Вот пример:
int a(int b)
{
b = 5; //Это никак не влияет на переменную b в функции main
return b;
}
int main()
{
int b = 1;
a(b); //Аргумент передан по значению
cout << b; //Будет выведено 1
return 0;
}
Пример 2:
int a(int &b)
{
b = 5; //Переменная b внутри функции main будет перезаписана
return b;
}
int main()
{
int b = 1;
a(b); //Аргумент передан по ссылке
cout << b; //будет выведено 5
return 0;
}
Вы не различили цитаты. Здесь идет речь про две разные концепции (передача по значению и по ссылке).
Отсюда следует, что правильный ответ на вопрос это Г) функция получает доступ к аргументу в вызывающей программе.
Выводы - самый лучший вариант передачи аргумента в функцию - по ссылке(правда литералы не прокатят). Это особенно экономно, когда параметр - структура или класс.