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

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

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






Рассмотрим неявное преобразование объекта класса 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; просмотров: 284. Нарушение авторских прав; Мы поможем в написании вашей работы!



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

Расчетные и графические задания Равновесный объем - это объем, определяемый равенством спроса и предложения...

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

Обзор компонентов Multisim Компоненты – это основа любой схемы, это все элементы, из которых она состоит. Multisim оперирует с двумя категориями...

Гносеологический оптимизм, скептицизм, агностицизм.разновидности агностицизма Позицию Агностицизм защищает и критический реализм. Один из главных представителей этого направления...

Функциональные обязанности медсестры отделения реанимации · Медсестра отделения реанимации обязана осуществлять лечебно-профилактический и гигиенический уход за пациентами...

Определение трудоемкости работ и затрат машинного времени На основании ведомости объемов работ по объекту и норм времени ГЭСН составляется ведомость подсчёта трудоёмкости, затрат машинного времени, потребности в конструкциях, изделиях и материалах (табл...

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

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

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

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