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

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

4.6 Перегрузка функций

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

В приведённом далее тексте программы три функции с именем Pow. Первая выполняет операцию возведения вещественного числа a в дробную степень n=\frac{k}{m}, где k и m — целые числа. Вторая возводит вещественное число a в целую степень n, а третья — целое число a в целую степень5Как известно, операция a^n не определена при a = 0 и n = 0, а так же при возведении отрицательного значения a в дробную степень n=\frac{k}{m}, где m — чётное число (п. 2.7).Пусть наши функции в этих случаях возвращают 0. n. Какую именно функцию вызвать компилятор определяет по типу фактических параметров. Так, если a — вещественное число, а k — целое, то оператор Pow(a,k) вызовет вторую функцию, так как она имеет заголовок float Pow(float a, int n). Команда Pow((int)a,k) приведёт к вызову третьей функции float Pow(int a, int n), так как вещественная переменная a преобразована к целому типу. Первая функция float Pow(float a, int k, int m) имеет три параметра, значит, обращение к ней осуществляется командой Pow(a,k,m).

#include <iostream>
using namespace std;
#include <math.h>
float Pow( float a, int k, int m) //Первая функция
{
	cout<<"Функция 1 \t";
	if ( a==0)
	return 0;
	else if ( k==0)
	return 1;
	else if ( a>0)
	return exp ( ( float ) k/m *log ( a ) );
	else if (m%2!=0)
	return -(exp ( ( float ) k/m *log (-a ) ) );
}
float Pow( float a, int n ) //Вторая функция
{
	float p; int i;
	cout<<"Функция 2 \t";
	if ( a==0)
		return 0;
	else if ( n==0)
		return 1;
	else if ( n<0)
	{
		n= -n;
		p=1;
		for ( i =1; i<=n; i ++)
		p*=a;
		return ( float ) 1/p;
	}
	else
	{
		p=1;
		for ( i =1; i<=n; i ++)
		p*=a;
		return p;
	}
}
float Pow( int a, int n ) //Третья функция
{
	int i, p;
	cout<<"Функция 3 \t";
	if ( a==0)
		return 0;
	else if ( n==0)
		return 1;
	else if ( n<0)
	{
		n= -n;
		p=1;
		for ( i =1; i<=n; i ++)
		p*=a;
		return ( float ) 1/p;
	}
	else
	{
		p=1;
		for ( i =1; i<=n; i ++)
		p*=a;
		return p;
	}
}
int main ( )
{
	float a; int k, n,m;
	cout<<"a="; cin >>a;
	cout<<"k="; cin >>k;
	cout<<"s="<<Pow( a, k )<<"\n"; //Вызов 2-й функции.
	cout<<"s="<<Pow ( ( int ) a, k )<<"\n"; //Вызов 3-й функции.
	cout<<"a="; cin >>a;
	cout<<"k="; cin >>k;
	cout<<"m="; cin >>m;
	cout<<"s="<<Pow( a, k,m)<<endl; //Вызов 1-й функции.
	return 0;
}
				

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

a=5.2
k=3
Функция 2 s=140.608
Функция 3 s=125
a=-8
k=1
m=1
Функция 1 s=-8
a=5.2
k=-3
Функция 2 s=0.00711197
Функция 3 s=0.008
a=-8
k=1
m=3
Функция 1 s=-2
				
Сергей Радыгин
Сергей Радыгин

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

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

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

 

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

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