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

          cout<<sum1;}                 //вывод значений атрибутов результата

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

значение атрибутов объекта:

а=27; b=25

Чтобы получить возможность записать равенство sum1=a1^a2, где а1, a2 и sum1 – объекты класса my_obj (см. пример) и распечатать полученное среднее значение результирующего объекта в удобочитаемом виде, были введены также переопределения для операции присваивания "=" и операции вывода "<<" (для случаев, когда слева и справа в указанных операциях операнды являются объектами класса).

В переопределении операций "^" и "=" переопределяющая функция реализована как метод класса. Поэтому в списке передаваемых параметров функции определен только второй операнд, в примере это объекты класса my_obj - obj_two и obj_sec соответственно. В выражениях они играют роль операндов, записываемых справа от переопределяемой операции. Первый параметр функции (левый операнд в выражениях с переопределенной операцией) не объявляется в списке передаваемых параметров. Считается, что в переопределяющем методе класса первый параметр должен быть объектом класса по умолчанию. Тип второго параметра задан в круглых скобках в списке передаваемых параметров метода.

Для переопределения операции вывода требовалось указать типы обоих передаваемых в функцию operator << параметров. Поэтому данная функция реализована как friend - функция.

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

Тема 6. ПЕРЕГРУЗКА ФУНКЦИЙ

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

При вызовах перегруженных функций путем сравнивания типов действительных передаваемых параметров с формальными (указанными в объявлении функции) выбирается нужный вариант кода функции.

Например, известные функции:

          char * itoa(int num, char * s, int radix);

          char * ltoa(long num, char * s, int radix);

          char * ultoa(unsigned long num, char * s, int radix);

преобразуют значения чисел типов int, long и unsigned long в строку символов, помещаемых в буфер, на начало которого указывает s; radix - система счисления (2 <= radix <= 36).

Все функции описаны в заголовочном файле stdlib.h стандартной библиотеки Borland C++. Определенное неудобство работы с таким набором функций очевидно. Необходимо помнить, какая из функций какому типу данных соответствует. Используя механизм перегрузки (переопределения) функций, можно добиться определенного упрощения ситуации. Мы можем ввести описание новой функции, например, с именем "toa", которая позволит выполнять преобразования, автоматически определяя, какой конкретный код функции необходимо использовать:

#include <iostream.h>

          #include <stdlib.h>

          char *toa(int num, char *s, int r)

          {return itoa(num,s,r); }

          char *toa(long num, char *s, int r)

          {return ltoa(num,s,r); }

          char *toa(unsigned long num, char *s, int r)

          {return ultoa(num,s,r); }

          void main(void)

          { char str[81];

int r;

          cout << "Задайте систему счисления от 2 до 36" << “\n”;

cin >> r;

          cout << "int = " << toa(3248,str,r) << “\n”;

cout << "long = " << toa(773681L,str,r) << “\n”;