Перегрузка функций в С++

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

float areaRectangle(float, float) //функция, вычисляющая площадь прямоугольника с двумя параметрами a(см) и b(см)
{
 return a * b; // умножаем длинны сторон прямоугольника и возвращаем полученное произведение 
}

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

Предположим, что наши исходные данные (стороны прямоугольника) заданы в метрах и сантиметрах, например такие: a = 2м 35 см; b = 1м 86 см. В таком случае, удобно было бы использовать функцию с четырьмя параметрами. То есть, каждая длинна сторон прямоугольника передаётся в функцию по двум параметрам: метры и сантиметры.

float areaRectangle(float a_m, float a_sm, float b_m, float b_sm) // функция, вычисляющая площадь прямоугольника с 4-мя параметрами a(м) a(см); b(м) b(cм)
{ 
  return (a_m * 100 + a_sm) * (b_m * 100 + b_sm);
}

В теле функции значения, которые передавались в метрах (a_m и b_m)переводятся в сантиметры и суммируются с значениями a_sm b_sm, после чего перемножаем суммы и получаем площадь прямоугольника в см. Конечно же можно было перевести исходные данные в сантиметры и пользоваться первой функцией, но сейчас не об этом.

Теперь, самое главное – у нас есть две функции, с разной сигнатурой, но одинаковыми именами (перегруженные функции). Сигнатура – это комбинация имени функции с её параметрами. Как же вызывать эти функции? А вызов перегруженных функций ничем не отличается от вызова обычных функций, например:

areaRectangle( 32, 43); // будет вызвана функция, вычисляющая площадь прямоугольника с двумя параметрами a(см) и b(см)
areaRectangle( 4, 43, 2, 12); // будет вызвана функция, вычисляющая площадь прямоугольника с 4-мя параметрами a(м) a(см); b(м) b(cм)

Как видите, компилятор самостоятельно выберет нужную функцию, анализируя только лишь сигнатуры перегруженных функций. Минуя перегрузку функций, можно было бы просто объявить функцию с другим именем, и она бы хорошо справлялась со своей задачей. Но представьте, что будет, если таких функций надо больше, чем две, например 10. И для каждой нужно придумать осмысленное имя, а сложнее всего их запомнить. Вот именно поэтому проще и лучше перегружать функции, если конечно в этом есть необходимость. Исходный код программы показан ниже.

#include "stdafx.h"
#include <iostream>
using namespace std;
// прототипы перегруженных функций
float areaRectangle(float a, float b);
float areaRectangle(float a_m, float a_sm, float b_m, float b_sm);
int main()
{
    cout << "S1 = " << areaRectangle(32,43) << endl; // вызов перегруженной функции 1
    cout << "S2 = " << areaRectangle(4, 43, 2, 12) << endl; // вызов перегруженной функции 2
    return 0;
}
// перегруженная функция 1
float areaRectangle(float a, float b) //функция, вычисляющая площадь прямоугольника с двумя параметрами a(см) и b(см)
{
return a * b; // умножаем длинны сторон прямоугольника и возвращаем полученное произведение
}
// перегруженная функция 2
float areaRectangle(float a_m, float a_sm, float b_m, float b_sm) // функция, вычисляющая площадь прямоугольника с 4-мя параметрами a(м) a(см); b(м) b(cм)
{
  return (a_m * 100 + a_sm) * (b_m * 100 + b_sm);
}

// код Code::Blocks

// код Dev-C++

#include <iostream>
using namespace std;
// прототипы перегруженных функций
float areaRectangle(float a, float b);
float areaRectangle(float a_m, float a_sm, float b_m, float b_sm);
int main()
{
    cout << "S1 = " << areaRectangle(32,43) << endl; // вызов перегруженной функции 1
    cout << "S2 = " << areaRectangle(4, 43, 2, 12) << endl; // вызов перегруженной функции 2
    return 0;
}
// перегруженная функция 1
float areaRectangle(float a, float b) //функция, вычисляющая площадь прямоугольника с двумя параметрами a(см) и b(см)
{
return a * b; // умножаем длинны сторон прямоугольника и возвращаем полученное произведение
}
// перегруженная функция 2
float areaRectangle(float a_m, float a_sm, float b_m, float b_sm) // функция, вычисляющая площадь прямоугольника с 4-мя параметрами a(м) a(см); b(м) b(cм)
{
  return (a_m * 100 + a_sm) * (b_m * 100 + b_sm);
}

Результат работы программы показан на рисунке 1.

CppStudio.com
S1 = 1376
S2 = 93916

Рисунок 1 — Перегрузка функций в С++

Практика

К сожалению, для данной темы пока нет подходящих задач. Если у вас есть таковые на примете, отправте их по адресу: admin@cppstudio.com. Мы их опубликуем!

Автор: admin
Дата: 25.08.2012
Поделиться:

Комментарии

  1. AM

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

    Именно благодаря перегрузке допускается дублирование имени функции.

  2. illidan10089

    в первом примере аргументы потерялись — » float areaRectangle(float, float) //функция, вычисляющая площадь прямоугольника с двумя параметрами a(см) и b(см) »  . спс

Оставить комментарий

Вы должны войти, чтобы оставить комментарий.