На самом деле это очень коварный вопрос, рассмотрение которого заслуживает гораздо большего, чем программа с 4 простыми функциями.
Первое, что нужно четко усвоить - внутрь функции попадает КОПИЯ того, что передано ей на вход. Причем в ряде случаев копирование может быть очень затратным мероприятием. Поэтому, если вам надо изменять данные, расположенные вне функции, при помощи каких-то действий внутри функции, то сделать это просто передав их в функцию не получится. Решением является передача в функцию не самих данных а указателя на них. В Си++ тот же эффект можно получить и при помощи передачи данных по ссылке. Ну а по настоящему весело становится, когда вам надо совместно использовать данные при помощи функций, которые выполняются в разных потоках. Тут вам потребуется изучать и использовать разного рода объекты типа мьютексов, которые позволяют организовать безопасный доступ к данным.
В качестве иллюстрации, что все не так просто, предлагаю небольшую программу:
#include
// Класс "Элемент данных" для исследования некоторых особенностей
// работы с данными
template
class DataItem
{
private:
T data{};
public:
// Конструктор для создания пустого объекта
DataItem()
{
std::cout << this << ": cоздание пустого объекта " << std::endl;
}
// Конструктор создания инициализированного объекта
DataItem( T Data )
{
data = Data;
std::cout << this << ": cоздание инициализированного объекта"
<< std::endl;
}
// Конструктор копирования
DataItem(DataItem& di)
{
void* other = (void*)(&di);
data = di.data;
std::cout << this
<< ": создание объекта с копированием данных из "
<< other << std::endl;
}
// Деструктор
~DataItem()
{
std::cout << this << ": уничтожение объекта" << std::endl;
}
// Сохранить данные в объекте
void set( T Data ) { data = Data; }
// Извлечение даных из объекта
T get( void ) { return data; }
// Вывод данных на экран
void show( void ) { std::cout << data << std::endl; }
};
// Функция, в котрую передаются наши данные
template void example_fn( DataItem item )
{
DataItem new_item = item;
new_item.show();
}
int main( int argc, char* argv[] )
{
DataItem item;
item.set( 345 );
std::cout << "Пример взаимодействия данных и функций:" << std::endl;
example_fn( item );
return 0;
}
Данные передаются в функцию example_fn по значению. Обратите внимание, какие фееричные вещи при этом происходят.