#include <iostream>

using namespace std;

void unchangingFunc(int passedVar) {
	passedVar = 5;  // Значение меняется только внутри функции
	cout << "Новое значение passedVar внутри unchangingFunc: " << passedVar << endl;
}


void swap(int &num1, int &num2) {
	/**
	& перед именем в списке аргументов означет, что передастся ссылка на память,
	с которой можно работать как со значением (обратное преобразование не нужно)
	*/
	int temp;
	temp = num1;
	num1 = num2;
	num2 = temp;
}


void add_lists( int first[], int second[], int total[], int length ) {
	/**
	При передаче массива значения в изначальном массиве также меняются
	Это поведение можно предотвратить используя const:
	void add_lists( const int first[], const int second[], int total[], int length )
	При таком объявлении, попытка изменить значения первых двух массивов внутри функции
	вызовет ошибку
	*/
	for( int i = 0; i < length; i++ ) {
		total[i] = first[i] + second[i];
	};
}


/*
Перегрузка функций позволяет создать несколько функций с одинаковыми именами,
но разными параметрами или количеством параметров
*/
void my_func(int first_arg) {
	cout << "My func called with one int argument" << endl;
}


void my_func(double first_arg) {
	cout << "My func called with one double argument" << endl;
}


void my_func(int first_arg, int second_arg) {
	cout << "My func called with two int arguments" << endl;
}


int main() {
	int myVar = 3;
	unchangingFunc(myVar);  // Внутри main значение myVar остаётся таким же
	cout << "Новое значение myVar после unchangingFunc: " << myVar << endl;

	int myOtherVar = 9;
	// При вызове функции, принимающей ссылки, дополнительные преобразования не нужны
	swap(myVar, myOtherVar);
	cout << "После смены мест значение myVar=" << myVar << ", myOtherVar=" << myOtherVar << endl;

	// Вызов перегруженный функций
	my_func(4);
	my_func(double(4));
	my_func(3, 5);

	return 0;
}