Читать лекция по информатике, вычислительной технике, телекоммуникациям: "Объектное программирование как технология программирования" Страница 3
- 1
- 2
- 3
- 4
- 5
- . . .
- последняя »
переменной неявно вводится ссылка, указывающая на эту переменную. Использование этой переменной в большинстве операций предполагает косвенное обращение по соответствующей ссылке. При инициализации такой переменной значением другой переменной создается ссылка на эту другую переменную. При использовании в любом выражении переменной - неявной ссылки реально производится косвенное обращение по созданной ссылке.Си++Эквивалент в "классическом" Си
-----------------------------------------------------//--------------- Инициализация константой -----------------int&a = 5;inta, *pa =a;
*pa = 5;
//--------------- Инициализация переменной -----------------intx;intx,*pa;
int&a = x;pa = &x;a = 5;*pa = 5;
//-------------- Неявная ссылка на структуру ----------------struct datstruct dat
{ int day,month,year };{ int day,month, year };
dat x;dat x;
dat& b = x;dat* pb = &x;
dat& c = {12,12,1990};dat cc = {12,12,1990};
dat *pc = &cc;b.year = 1990;pb->year= 1990;
c.day=b.day+3;pc->day = pb->day+3;
c = b;// Копирование pc->day = pb->day;
// структурыpc->month = pb->month;
pc->year = pb->year;Наиболее часто неявные ссылки используются при передаче параметров и результатов функций. В этом случае транслятор сам выбирает, что необходимо использовать в качестве фактического параметра - переменную или ссылку на нее, и что используется в качестве результата - ссылка или переменная, косвенно адресуемая по ссылке. Цель подобных ухищрений будет видна позднее - при переопределении операторов, а пока можно заметить, что вызов функций, с
параметрами - обычными значениями и неявными ссылками - синтаксически идентичен. То же самое касается результатов.В качестве иллюстрации рассмотрим три примера функций, имеющих в качестве формального параметра и результата структуру, которая передается соответственно:
- значением;
- явной ссылкой;
- неявной ссылкой.Пример 1.Параметры - значения
---------------------------------------------------------datInc(dat x)========> - копирование
{--------> - ссылка
x.day++;
return(x);----¬стек +---+x.day++
}¦ b =========> x =========¬
L----+---+¦ return(x)
voidmain()¦
{----¬стек +---+--¦-¬ временная
data,b,*p;¦ a day++
x->day++;----¬стек +---+
return(x);г===== b¦
a = *Inc(Inc(&b));¦ ¦ L----+-¦-+
p = Inc(&b);¦ ¦ ----¬¦return(x)
a = *p;¦ L--a ¦
L---
Пример 3.Параметры - неявные ссылки
---------------------------------------------------------dat&Inc(dat& x)x.day++неявная ссылка dat* px
{x.day++
x.day++;----¬стек +---+
return(x);г===== b¦
a = Inc(Inc(b));¦ ¦ L----+-¦-+
p = &Inc(b);¦ ¦ ----¬¦return(px)
a = *p;¦ L--a ¦
L---
Сравнение этих примеров показывает следующее:
- при работе с формальным параметром - неявной ссылкой используется имя формального параметра в качестве идентификатора переменной, которая заменяется транслятором на косвенное обращение по неявной ссылке;
- при возвращении результата используется имя переменной,которая заменяется транслятором неявной ссылкой на нее;
- примеры 2 и 3 идентичны по реализации, но отличаются по синтаксису вызова функции;
- примеры 1 и 3 отличаются по реализации, но идентичны по синтаксису вызова функции;
- из предыдущего следует, что при вызове функции список фактический параметров недостаточен для определения транслятором способа их передачи (значением или ссылкой), поэтому в Си++ для каждой внешней функции необходимо задать прототип.Так как размер структуры, передаваемой в качестве результата функции, может быть сколь угодно большим, то для его хранения необходимо создать временную переменную. Транслятор "Borland C" в этом случае поступает следующим
- 1
- 2
- 3
- 4
- 5
- . . .
- последняя »
Похожие работы
Интересная статья: Основы написания курсовой работы

(Назад)
(Cкачать работу)