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

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

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

касается результатов. В качестве иллюстрации рассмотрим три примера функций, имеющих в качестве формального параметра и результата структуру, которая передается соответственно: - значением; - явной ссылкой; - неявной ссылкой. Пример 1. Параметры - значения ---------------------------------------------------------dat Inc(dat x) ========> - копирование { --------> - ссылка x.day++; return(x); ----¬ стек +---+x.day++ } ¦ b =========> x =========¬ L---- +---+ ¦ return(x) void main() ¦ { ----¬ стек +---+ --¦-¬ временная dat

a,b,*p; ¦ a <========= x <======= ¦ переменная a = Inc(Inc(b)); L---- +---+ L---p = &Inc(b); x.day++ a = *p; } Пример 2. Параметры - явные ссылки ---------------------------------------------------------dat* Inc(dat* x) x->day++ { x->day++ x->day++; ----¬ стек +---+ return(x); г===== b <--------- x ¦ } ¦ --> <----¬ +-¦-+ ¦ ¦ L---- ¦ ¦return(x) ¦ ¦ г======+=====void main() a=*..¦ ¦ ¦ ¦ +---+ стек { ¦ ¦ --¦-¬ L---- x ¦ dat a,b,*p; ¦ ¦ ¦ =========> ¦ a = *Inc(Inc(&b)); ¦ ¦ L---- +-¦-+ p = Inc(&b); ¦ ¦ ----¬ ¦return(x) a = *p; ¦ L-- <===========} ¦ L--- ¦ ----¬ L====> a ¦ L--- Пример 3. Параметры - неявные ссылки

---------------------------------------------------------dat& Inc(dat& x) x.day++ неявная ссылка dat* px { x.day++ x.day++; ----¬ стек +---+ return(x); г===== b <--------- px¦ } ¦ --> <----¬ +-¦-+ ¦ ¦ L---- ¦ ¦return(px) ¦ ¦ г======+=====void main() a=*..¦ ¦ ¦ ¦ +---+ стек { ¦ ¦ --¦-¬ L---- px¦ dat a,b,*p; ¦ ¦ ¦ =========> ¦ a = Inc(Inc(b)); ¦ ¦ L---- +-¦-+ p = &Inc(b); ¦ ¦ ----¬ ¦return(px) a = *p; ¦ L-- <===========} ¦ L--- ¦ ----¬ L====> a ¦ L--- Сравнение этих примеров показывает следующее: - при работе с формальным параметром - неявной ссылкой используется имя формального

параметра в качестве идентификатора переменной, которая заменяется транслятором на косвенное обращение по неявной ссылке; - при возвращении результата используется имя переменной,которая заменяется транслятором неявной ссылкой на нее; - примеры 2 и 3 идентичны по реализации, но отличаются по синтаксису вызова функции; - примеры 1 и 3 отличаются по реализации, но идентичны по синтаксису вызова функции; - из предыдущего следует,

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