cout<<sum1;} //вывод значений атрибутов результата
Результаты работы программы:
значение атрибутов объекта:
а=27; b=25
Чтобы получить возможность записать равенство sum1=a1^a2, где а1, a2 и sum1 – объекты класса my_obj (см. пример) и распечатать полученное среднее значение результирующего объекта в удобочитаемом виде, были введены также переопределения для операции присваивания "=" и операции вывода "<<" (для случаев, когда слева и справа в указанных операциях операнды являются объектами класса).
В переопределении операций "^" и "=" переопределяющая функция реализована как метод класса. Поэтому в списке передаваемых параметров функции определен только второй операнд, в примере это объекты класса my_obj - obj_two и obj_sec соответственно. В выражениях они играют роль операндов, записываемых справа от переопределяемой операции. Первый параметр функции (левый операнд в выражениях с переопределенной операцией) не объявляется в списке передаваемых параметров. Считается, что в переопределяющем методе класса первый параметр должен быть объектом класса по умолчанию. Тип второго параметра задан в круглых скобках в списке передаваемых параметров метода.
Для переопределения операции вывода требовалось указать типы обоих передаваемых в функцию operator << параметров. Поэтому данная функция реализована как friend - функция.
Следует отметить, что вводимое переопределение оператора не может изменить ни числа аргументов, ни правил приоритета оператора по сравнению с его нормальным использованием. Переопределение возможно только для уже существующих в языке операций, кроме операций "." задание элемента класса, ".*" - прямое обращение к элементу класса, "::" - определение области доступа, "?:" - условная операция.
В языке С, как и в большинстве других процедурных языков, функции должны иметь уникальные имена. В С++ имеется возможность использовать несколько функций с одним и тем же именем. Когда несколько функций определяются с одним и тем же именем в рамках одной области действия, то говорят, что они перегружены.
При вызовах перегруженных функций путем сравнивания типов действительных передаваемых параметров с формальными (указанными в объявлении функции) выбирается нужный вариант кода функции.
Например, известные функции:
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”;
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.