Опубликован: 07.03.2015 | Уровень: для всех | Доступ: свободно | ВУЗ: Компания ALT Linux
Лекция 4:

Использование функций при программировании на C++

4.2 Передача параметров в функцию

Обмен информацией между вызываемой и вызывающей функциями осуществляется с помощью механизма передачи параметров.Список_переменных, указанный в заголовке функции, называется формальными параметрами или просто параметрами функции. Список_переменных в операторе вызова функции — это фактические параметры или аргументы.

Механизм передачи параметров обеспечивает замену формальных параметров фактическими параметрами и позволяет выполнять функцию с различными данными. Между фактическими параметрами в операторе вызова функции и формальными параметрами в заголовке функции устанавливается взаимно однозначное соответствие. Количество, типы и порядок следования формальных и фактических параметров должны совпадать.

Передача параметров выполняется следующим образом. Вычисляются выражения, стоящие на месте фактических параметров. В памяти выделяется место под формальные параметры в соответствии с их типами. Затем формальным параметрам присваиваются значения фактических. Выполняется проверка типов и при необходимости выполняется их преобразование.

Передача параметров в функцию может осуществляться по значению и по адресу.

При передаче данных по значению функция работает с копиями фактических параметров, и доступа к исходным значениям аргументов у неё нет. При передаче данных по адресу в функцию передаётся не переменная, а её адрес, и, следовательно, функция имеет доступ к ячейкам памяти, в которых хранятся значения аргументов. Таким образом, данные, переданные по значению, функция изменить не может, в отличие от данных, переданных по адресу.

Если требуется запретить изменение параметра внутри функции, используют модификатор const. Заголовок функции в общем виде будет выглядеть так:

тип имя_функции ( const тип_переменной* имя_переменной, ...)
		

Например:

#include <iostream>
using namespace std;
int f1 ( int i ) //Данные передаются по значению
{
	return ( i ++);
}
int f2 ( int * j ) //Данные передаются по адресу. При подстановке фактического параметра,
//для получения его значения, применяется операция разадресации * .
{
	return ( ( * j )++);
}
int f3 ( const int * k ) //Изменение параметра не предусмотрено .
{
	return ( ( * k )++);
}
int main ( )
{
	int a;
	cout<<"a="; cin >>a;
	f1( a );
	cout<<"a="<<a<<"\n";
	f2(&a ); //Для передачи фактического параметра используется операция взятия адреса & .
	cout<<"a="<<a<<"\n";
	f3(&a );
	cout<<"a="<<a<<"\n";
	return 0;
}
		

Результат работы программы:

Введено значение переменной a.

a=5
		

Значение переменной a после вызова функции f1 не изменилось.

a=5
		

Значение переменной a после вызова функции f2 изменилось.

a=6
		

Значение переменной a после вызова функции f3 не изменилось.

a=6
		

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

Далее приведён пример программы, в которой исходя из радианной меры некоторого угла вычисляется величина смежного с ним угла. На экран выводятся значения углов в градусной мере. Функция degree выполняет перевод из радианной меры в градусную2Чтобы найти градусную меру угла по заданной радианной, нужно помножить число радиан на\frac{180}{\pi }; если из полученной дроби выделить целую часть, то получим градусы; если из числа полученного умножением оставшейся дробной части на 60, выделить целую часть, получим минуты; секунды вычисляются аналогично из дробной части минут.. Эта функция ничего не возвращает. Её аргументами являются значение переменной rad, определяющее величину угла в радианах, и адреса переменных deg, min, sec, в которых будут храниться вычисленные результаты — градусная мера угла.

#include <iostream>
#include <math.h>
#define PI 3.14159
using namespace std;
void degree ( double rad, int * deg, int * min, int * sec )
{
	* deg= floor ( rad * 180/ PI );
	* min=floor ( ( rad * 180/ PI -(* deg ) ) * 60);
	* sec=floor ( ( ( rad * 180/ PI -(* deg ) ) *60 -(* min ) ) * 60);
}
int main ( )
{
	int DEG, MIN, SEC; double RAD;
	cout<<" Inpout :"<<endl;
	cout << " Value in radian A="; cin >>RAD;
	degree (RAD,&DEG,&MIN,&SEC);
	cout << DEG<<" "<<MIN<<" "<<SEC << endl;
	degree ( PI- RAD,&DEG,&MIN,&SEC);
	cout << DEG<<" "<<MIN<<" "<<SEC << endl;
	return 0;
}
		
Сергей Радыгин
Сергей Радыгин

Символы кириллицы выводит некорректно. Как сделать чтобы выводился читабельный текст на русском языке?

Тип приложения - не Qt,

Qt Creator 4.5.0 основан на Qt 5.10.0. Win7.

 

Юрий Герко
Юрий Герко

Кому удалось собрать пример из раздела 13.2 Компоновка (Layouts)? Если создавать проект по изложенному алгоритму, автоматически не создается  файл mainwindow.cpp. Если создавать этот файл вручную и добавлять в проект, сборка не получается - компилятор сообщает об отсутствии класса MainWindow. Как правильно выполнить пример?