Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

Неявное преобразование типов





Рассмотрим неявное преобразование объекта класса dat к базовым типам данных int и long. Сущность его заключается в вычислении полного количества дней в дате, заданной входным объектом (long) и количества дней в текущем году в этой же дате (int). Для задания этих операции необходимо переопределить в классе dat одноименные операции int и long. Переопределяемые операции задаются соответствующими функциями-элементами без параметров. Тип результата совпадает с базовым типом, к которому осуществляется приведение и поэтому не указывается:

01 #include <stdio.h>02 class dat03 {04 int day, month, year;05 public:06 operator int (); // Преобразование dat в int 07 operator long (); // Преобразование dat в long 08 long operator -(dat &p);// Операция dat-dat вычисляет 09 dat(); // разность дат в днях 10 dat(char *);11 };12 static int days[]={0,31,28,31,30,31,30,31,31,30,31,30,31};13 dat:: operator int ()14 {15 int r; // Текущий результат 16 int i; // Счетчик месяцев 17 for (r=0, i=1; i<month; i++) // Число дней в прошедших 18 r += days[month]; // месяцах 19 if ((month==2) && (year%4==0)) r++; // Високосный год 20 r += day; // Дней в текущем месяце 21 return (r);22 }23 dat:: operator long ()24 {25 long r; // Текущий результат 26 r = 365 * (year-1); // Дней в предыдущих полных годах 27 r += year / 4; // Високосные года 28 r += (int)(* this); // Дней в текущем году 29 return (r);30 }31 long dat:: operator -(dat& p)32 { return ((long)(* this) - (long)p); }33 void main()34 {35 char *p;36 dat a(p="12-05-1990"); // Дата, заданная строкой 37 dat b; // Текущая дата 38 int c;39 long d;40 printf("С %s прошло %4ld дней\n",p,(long)b-(long)a);41 printf("В этом году прошло %3d дней\n",(int)b);42 c = b;43 d = b - a; // Операция dat-dat 44 printf("С %s прошло %4ld дней\n",p,d);45 printf("В этом году прошло %3d дней\n",c);46 }

Друзья-функции и друзья-классы

Теперь, наконец, можно обсудить, в каких случаях для доступа к закрытой части определяемого пользователем типа использовать члены, а в каких - друзей. Некоторые операции должны быть членами: конструкторы, деструкторы и виртуальные функции (см. следующую главу), но обычно это зависит от выбора. Рассмотрим простой класс X:

class X { //... X(int); int m(); friend int f(X&);};

Внешне не видно никаких причин делать f(X&) другом дополнительно к члену X::m() (или наоборот), чтобы реализовать действия над классом X. Однако член X::m() можно вызывать только для "настоящего объекта", в то время как друг f() может вызываться для объекта, созданного с помощью неявного преобразования типа. Например:

void g(){ 1.m(); // синтаксическая ошибка f(1); // f(x(1)); - синтаксически верно }

Поэтому операция, изменяющая состояние объекта, должна быть членом, а не другом. Для определяемых пользователем типов операции, требующие в случае фундаментальных типов операнд lvalue (=, *=, ++ и т.д.), наиболее естественно определяются как члены. И наоборот, если нужно иметь неявное преобразование для всех операндов операции, то реализующая ее функция должна быть другом, а не членом. Это часто имеет место для функций, которые реализуют операции, не требующие при применении к фундаментальным типам lvalue в качестве операндов (+, -, || и т.д.).

Если никакие преобразования типа не определены, то оказывается, что нет никаких существенных оснований в пользу члена, если есть друг, который получает ссылочный параметр, и наоборот. В некоторых случаях программист может предпочитать один синтаксис вызова другому. Например, оказывается, что большинство предпочитает для обращения матрицы m запись m.inv(). Конечно, если "inv()" действительно обращает матрицу m, а не просто возвращает новую матрицу, обратную m, ей не следует быть другом.

При прочих равных условиях выбирайте, чтобы функция была членом: никто не знает, вдруг когда-нибудь кто-то определит операцию преобразования. Невозможно предсказать, потребуют ли будущие изменения изменить статус объекта. Синтаксис вызова функции члена ясно указывает пользователю, что объект можно изменить; ссылочный параметр является далеко не столь очевидным. Кроме того, выражения в члене могут быть заметно короче выражений в друге. В функции друге надо использовать явный параметр, тогда как в члене можно использовать неявный this. Если только не применяется перегрузка, имена членов обычно короче имен друзей.

 







Дата добавления: 2015-10-01; просмотров: 303. Нарушение авторских прав; Мы поможем в написании вашей работы!




Важнейшие способы обработки и анализа рядов динамики Не во всех случаях эмпирические данные рядов динамики позволяют определить тенденцию изменения явления во времени...


ТЕОРЕТИЧЕСКАЯ МЕХАНИКА Статика является частью теоретической механики, изучающей условия, при ко­торых тело находится под действием заданной системы сил...


Теория усилителей. Схема Основная масса современных аналоговых и аналого-цифровых электронных устройств выполняется на специализированных микросхемах...


Логические цифровые микросхемы Более сложные элементы цифровой схемотехники (триггеры, мультиплексоры, декодеры и т.д.) не имеют...

Приготовление дезинфицирующего рабочего раствора хлорамина Задача: рассчитать необходимое количество порошка хлорамина для приготовления 5-ти литров 3% раствора...

Дезинфекция предметов ухода, инструментов однократного и многократного использования   Дезинфекция изделий медицинского назначения проводится с целью уничтожения патогенных и условно-патогенных микроорганизмов - вирусов (в т...

Машины и механизмы для нарезки овощей В зависимости от назначения овощерезательные машины подразделяются на две группы: машины для нарезки сырых и вареных овощей...

Характерные черты официально-делового стиля Наиболее характерными чертами официально-делового стиля являются: • лаконичность...

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

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

Studopedia.info - Студопедия - 2014-2025 год . (0.013 сек.) русская версия | украинская версия