Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lec_prog2_ru_2016_3.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
334 Кб
Скачать
☆

Void main()

{char oper; ---

int x=2,y=4,z; |

. . . |

{int k=5; ––– |

int x=3; | |

x+=3 .. | |

} ––– |

…} –––

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

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

5 Ссылки

Ссылка – это еще одно имя существующего объекта.

Синтаксис определения ссылки следующий:

тип & имя_ссылки=инициализирующее_выражение;

где инициализирующее_выражение – это имя объекта, который уже имеет место в памяти, а тип – это тип этого объекта.

Например:

int x=20; //определена и проинициализирована переменная х

int &pх=х; // определена ссылка, значением которой является

// адрес переменной х

float g=5.5;//определена и проинициализирована переменная g.

float &pg=g; // определена ссылка, значением которой является

// адрес переменной g

В определении ссылки символ & не является частью типа, т.е. x или pх имеют тип int. Имя_ссылки определяет место расположе­ния инициализирующего объекта.

Ссылка – это адрес объекта, поэтому сходна с указателем. Но у ссылки имеются существенные особенности.

1) Обращение к ссылке аналогично обращению к переменной, для доступа к содержимому ссылки не нужно выполнять операцию разыменования. Например, допустимо:

double f=5.5;// определена и проинициализирована переменная f.

double &pf=f; //определена ссылка pf c адресом f

double *fp1=&f; //определен указатель fp1 c адресом f.

f=2.5; //переменной f присвоено значение 2.5

pf=1.5; //переменной f присвоено значение 1.5

*fp1=10.5; //переменной f присвоено значение 10.5

2) Размер ссылки – это размер переменной, связанной со ссылкой при инициализации, а размер указателя, в общем случае 4 байта.

int n1=sizeof(pf); // n1=8 (тип double)

int n2=sizeof(fp1);// n2=4(2 байта-сегмент, байта-смещение)

3) При определении ссылки ее необходимо инициализировать.

int x=100;

Int &хref; // ошибка!!

int &хref=х;// правильно!!

4) Нельзя переопределить ссылку, т.е. изменить адрес переменной, на которую она ссылается.

int x1=50;

хref=х1; // переменной х присвоится значение х1.

// ссылка хref будет по-прежнему ссылаться х .

Cсылки – это не настоящие объекты, поэтому существуют ограничения при определении и использовании ссылок:

  1. Ссылка не может иметь тип void.

  2. Ссылку нельзя создать с помощью операции new, т.е. для ссылки нельзя выделить новый участок памяти.

  3. Нельзя определить ссылку на другую ссылку и указатель на ссылку.

  4. Нельзя создать массив ссылок.

В определении ссылки можно использовать модификатор const, т.е. допустимо определить ссылку на константу. Например:

double d=2.728282; // определили переменную

const double &ref_d=d; //определили ссылку на константу

d=0.1;// допустимо

ref_f=0.2; // ошибка!!

При определении ссылок обязательна инициализация, но при описании  ссылки инициализация необязательна в таких случаях:

1) при описании внешних ссылок.

float & ref1; // ошибка!! нет инициализации ссылки

extern float &ref2; //допустимо! Инициализируется в другом блоке

2) в спецификации формальных параметров и при описании типа функции.

3) при описании ссылок на компоненты класса.

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

Пример.

#include<stdio.h>

int f1_ref(int &a, int &b) {return a+b;}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]