Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоры программирование.doc
Скачиваний:
7
Добавлен:
17.04.2019
Размер:
257.54 Кб
Скачать
  1. Перегрузка функций.

Передача аргументов по ссылке и по значению. Перегрузка функций.

Алгоритм Евклида может быть использован не только для нахождения наибольшего общего делителя gcd(a,b)двух целых чисел a и b, но также для представления наибольшего общего делителя как целой линейной комбинации a и b. Т.е. если a и b целые и одновременно не равны нулю, то существуют такие целые числа x и y, что a∙x+b∙y=gcd(a,b).

Наша цель – определить функцию gcd(a,b,x,y)=d, где a и b числа, наибольший общий делитель gcd(a,b) которых мы ищем, d= gcd(a,b), а числа x и y обладают свойством a∙x+b∙y=d.

Во-первых, заметим, что функции gcd(a,b,x,y) и gcd(a,b) имеют одинаковый тип возвращаемого значения и одинаковое название, однако, отличаются по количеству аргументов, либо по типу аргументов. Это называется перегрузкой функции (overloading).

Во-вторых, числа x и y, переданные в функцию gcd(a,b,x,y), должны изменяться при выходе из нее. Если мы просто передадим их в функцию gcd(a,b,x,y) , то при выходе из нее их величины вернут свои прежние значения. Поясним это на простейшем примере двух функций, одна из которых меняет местами значения двух переменных, а другая увеличивает значение переменной на единицу.

int main(int argc, char* argv[])

{

int x = 3;

int y = 7;

std::cout << "Main. Before swap: " << std::endl;

std::cout << "x= " << x << std::endl;

std::cout << "y= " << y << std::endl;

swap (x,y);

std::cout << "Main. After swap: " << std::endl;

std::cout << "x= " << x << std::endl;

std::cout << "y= " << y << std::endl;

_getch();

return 0;

}

Функция swap (x,y) определена следующим образом:

void swap (int x, int y)

{

int temp;

temp = x;

x = y;

y =temp;

std::cout << "swap. After swap: " << std::endl;

std::cout << "x= " << x << std::endl;

std::cout << "y= " << y << std::endl;

}

Выполнить программу пошагово и просмотреть изменение переменных x и y в окне Local Variables и убедиться, что при выходе из функции данные переменные принимают свои первоначальные значения.

Аналогично можно определить функцию increase(x), увеличивающую значение x на единицу:

int main(int argc, char* argv[])

{

int x = 3;

std::cout << "increase(x)= " << increase(x) << std::endl;

std::cout << "Main. After increase : " << std::endl;

std::cout << "x= " << x << std::endl;

_getch();

return 0;

}

Функция increase(x) определена так:

int increase(int x)

{

x++;

std::cout << "increase. After increment: " << std::endl;

std::cout << "x= " << x << std::endl;

return x;

}

Выполнить программу пошагово и просмотреть изменение переменной x в окне Local Variables и убедиться, что при выходе из функции переменная принимает свое первоначальное значение.

Для того, чтобы данная процедура имела эффект переменные в функции надо передавать при помощи указателей или ссылок.