Теоретические сведения для студентов специальностей «Экономика и организация производства», страница 19

cout << "unsigned long = "<<toa(3456789000UL,str,r)<< “\n”;}

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

          Задайте систему счисления от 2 до 36.

          10 <ввод>

          int = 3248

          long = 773681

          unsigned loug = 3456789000

Рассмотрим еще один пример перегрузки функций.

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

          #include <iostream.h>    // первое описание функции

iut fun (int i, int j)

{ cout << "функция оперирует целыми числами\n";

 return i+j;}            // второе описание функции

double fun (double i, double j)

{ cout << "функция оперирует вещественными числами\n"; return i-j; }

void main (void) {Cout << "2+3 = " << fun (2,3) << "\n";  // целыечисла

cout<<"2.50-3.6="<< fun (2.5,3.6) << "\n" ;} // вещественные числа.

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

Пример перегрузки конструктора:

#include <iostream.h>

class Over { int i;

          char *str; public:

Over() { str = "первый конструктор\n"; i = 0; }; // это первый конструктор

Over(char *S) { str = S; i = 50; };

//это второй конструктор, строка символов может задаваться

// извнеметодовкласса

          Over(char *S,int X) { str = S; i = X; };

//это третий конструктор, принимающий параметры S и Х

// и инициализирующий частные переменные класса

          Over(int *Y) { str = "четвертый конструктор\n"; i = *Y; };

//конструктор принимает в качестве

//параметра указатель и присваивает значение, извлекаемое

// из переданного адреса, частной переменной i.

void print(void) { cout << "i = " << i << "; str = " << str; }};

//объявление и определение метода класса

 void main(void) { int a = 10,*b;           //переменная типа int и указатель на тип int

 b = &a;                           //инициализация указателя адресом переменной

//объявление четырех объектов: my_over, my_over1 и my_over2;

 Over my_over,                         //для конструктора без параметров

my_over1("для конструктора с одним параметром\n"),

my_over2("для конструктора с двумя параметрами\n",100),

my_over3(b);                            // для конструктора с указателем

//вызовы метода print() для объектов:

my_over.print();              // для объекта, созданного конструктором Over()

my_over1.print(); // для объекта, созданного конструктором Over(char *S)

my_over2.print();  // для объекта, созданного конструктором Over(char *S,int X)

my_over3.print(); // для объекта, созданного конструктором Over(int *Y) }

В примере определено 4 конструктора: без параметров, с одним параметром - ссылкой на тип строка, с двумя параметрами и с одним параметром - ссылкой на int.

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

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

i = 0 ; str = первый конструктор

i = 50; str = для конструктора с одним параметром

i = 100;str = для конструктора с двумя параметрами

i = 10; str = четвертый конструктор