Будут напечатаны 4, 12 и 28, каждое число с новой строки. refFunc возвращает ссылку на глобальный counter, поэтому присваивание результату вызова меняет сам counter.
Определите вывод программы с функцией‑ссылкой
Будут напечатаны 4, 12 и 28, каждое число с новой строки. refFunc возвращает ссылку на глобальный counter, поэтому присваивание результату вызова меняет сам counter.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Нужно понять, какие значения будут напечатаны при выполнении следующего кода.
#include <iostream>
int counter = 2;
int& refFunc(int x){
counter = counter + x;
return counter;
}
int main(){
int val = 2;
std::cout << refFunc(val) << std::endl;
refFunc(val) = 10;
std::cout << refFunc(val) << std::endl;
val = refFunc(val);
std::cout << refFunc(val) << std::endl;
}
Ответ
Будут напечатаны 4, 12 и 28, каждое число с новой строки. refFunc возвращает ссылку на глобальный counter, поэтому присваивание результату вызова меняет сам counter.
Сначала counter увеличивается с 2 до 4. В refFunc(val) = 10 вызов сначала повышает его до 6, затем присваивание устанавливает 10. Следующий вывод добавляет val = 2 и печатает 12.
Далее val = refFunc(val) увеличивает counter до 14 и копирует это значение в val. Последний вызов добавляет уже 14 к 14 и печатает 28. Ссылка допустима, поскольку counter имеет статическую длительность хранения.