Объективное программирование — страница 7

  • Просмотров 9329
  • Скачиваний 351
  • Размер файла 45
    Кб

---------------------------------- При определении формальных параметров функции может быть указано его значение, принимаемое при вызове по умолчанию при отсутствии этого параметра в списке фактических: //----- Функция устанавливает по умолчанию текущее значение года, //----- месяца и дня #include <dos.h> void dat::SetDat(int d=0, int m=0, int y=0) { struct date x; getdate(&x); // Стандартная функция получения // текущей даты // Проверка на значение по умолчанию year = (y == 0) ? x.da_year : y; month= (m

== 0) ? x.da_month: m; day = (d == 0) ? x.da_day : d; } 2.7 Контроль преобразования типов ссылок --------------------------------------- В "классическом" Си при выполнении присваивания, передаче фактических параметров происходит автоматическое преобразование ссылок к базовым типам данных (int,unsigned) и наоборот, а также преобразование одного типа ссылки к другому. В Си++ такие "вольности" исключены, программист должен сам выполнить явное преобразование. Например,

при использовании функции распределения динамической памяти, имеющей прототип в "alloc.h" extern void* malloc(int n); dat *p; p = (dat *) malloc (10*sizeof(dat)); ¦ L--- преобразование void* в dat* Естественно, что это преобразование типов фиктивное в том смысле, что не меняет значения ссылки и не приводит к генерации кода. Оно только меняет "точку зрения" транслятора на данную ссылку. 2.8 Вставляемые (inline) функции ------------------------------- Если функция (обычная или

элемент-функция структуры или класса) объявлены inline-функциями, то при вызове таких функций транслятор выполняет подстановку по тексту программы тела функции с соответствующей заменой формальных параметров на фактические. Элемент-функция также считается inline по умолчанию, если ее тело определено непосредственно в определении структуры (или класса),например: struct dat { int d,m,y; void Setdat(char *p) // Функция inline по умолчанию { ... // Тело функции

} 2.9 Ссылки на элементы структуры ------------------------------- Если структура имеет несколько элементов одного типа,то для нее может быть создана "внутренняя" ссылка, которая принимает значение внутреннего адреса (смещения) элемента относительно выбранной структуры. Формирование и использование такой ссылки ясно из примера: struct dat { int day,month,year; void Getdat(); void Putdat(); void Nextdat(); } int dat::*p; // Ссылка на элемент типа int // в структуре dat p = & dat::month; //

Значение p - смещение (адрес) // элемента month в структуре типа // dat dat x,*px = &x; // x.*p = 5; // Обращение по внутренней ссылке px->*p = 5; // <dat> . *<ссылка на элемент> // <*dat>-> *<ссылка на элемент> Эквивалентно x.month = 5; px->month =5; Аналогичная внутренняя ссылка может быть создана для элементов-функций, принадлежащих одной структуре, при этом функции должны быть идентичными по результатам и параметрам: void (dat::*fun)(); // Ссылка на