Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Использование ссылок для связи функций

Объявление ссылки

ЛЕКЦИЯ № 8

 

ТЕМА: ССЫЛКИ В ПРОГРАММАХ НА ЯЗЫКЕ С++

 

СОДЕРЖАНИЕ

1. Объявление ссылки

1.2 Использование ссылок для связи функций

1.3 Ключевое слово const

 

ВВЕДЕНИЕ

 

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

 

1. ССЫЛКИ В ПРОГРАММАХ НА ЯЗЫКЕ С++

 

Известно, что указатели в языке С и С++ содержат адрес объекта. Ссылки – это специальный тип указателя. Ссылки также содержат адрес объекта, но подчиняются другим правилам. Основное правило таково: ссылки позволяет работать с указателями как с обычными объектами.

В языке С тип данных «ссылка» отсутствует. Ссылки появились в языке С ++ с целью упростить разработку программ. Ссылка в программе обозначается амперсандом (&) — тем же символом, который используется для обозначения операции получения адреса.

Пример объявления ссылкиint &а = 10;Можно и так:int number = 5;int &a number;

В последнем случае ссылка a становится синонимом переменной number и теперь, если выполнить оператор a = 5;, то и переменная number примет значение 5. В последнем операторе int &a number; ссылка инициализируется адресом переменной number, а оператор a=5 есть ни что иное, как запись числа по адресу, который хранит ссылка (если бы переменная а была бы указателем, то *a = 5).

 

Особенности ссылок таковы.

1. Ссылку типа void объявить нельзя!

 

2.Указатели не обязательно инициализировать во время объявления, но они должны быть проинициализированы до первого использования. Ссылки необходимо инициализировать сразу же при объявлении.

int &a; // ошибка! Объявление ссылки без инициализации.a = 5; // ошибка! Инициализация запоздала.

В следующем примере

MyStruct *p_struct = new MyStract;

MyStruct &ret = *p_struct;

 

Ссылка инициализируется адресом, на который ссылается указатель p_struct. Если так:

 

Mystruct *p_struct = new MyStruct;

Mystruct &ret;

ret = *p_struct;,

 

то компилятор выдаст сообщение об ошибке.

 

3. Ссылку нельзя устанавливать в "ноль" или NULL как указатели.

 

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

/* программа # 1.1 */

 

#pragma hdrstop

#include <condefs.h>

#include <stdio.h>

#include <conio.h>

#pragma argsused

int main(int argc, char* argv[])

{

int b = 5;

int &a =b; // инициализируем ссылку адресом переменной b

int * point = &a; // инициализируем указатель адресом, который хранится в а

int &c = *point; // инициализируем ссылку адресом, который хранится в //указателе point;

// Фактически &c, point, &a - должны содержать один и тот же адрес переменной b

printf("point= %p a = %p addr b = %p c = %p \n", point, &a, &b, &c);

getch ();

return 0;

}

Результат работы программы таков:

point= 0012FF88 a = 0012FF88 addr_b = 0012FF88 c = 0012FF88

Главный вывод из результата работы программы: все адреса одинаковы!

Обратите внимание на два ключевых оператора:

int * point = &a; // инициализируем указатель адресом, который хранится в а

int &c = *point; // инициализируем ссылку адресом, который хранится в //указателе point;

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

 

Рассмотрим программу, в которой осуществляется обмен значений переменных с помощью функции swap () с применением указателей.

 

/* программа # 1.2 */

 

void swap(int *,int *); // прототип функции

void main()

{

int a = 10,b = 20;

 

swap (&a, &b);

}

 

/*эта функция выполняет обмен значений переменных */

void swap(int *x,int *y)

{

int c; /* временная переменная */

 

/*запоминаем значение переменной, на которую ссылается указатель х */

c = *x;

/*ниже неверно, так как переменной с будет присвоен адрес, а не само значение переменной, на которую ссылается указатель х */

// с = х; //Ошибка

/*переменной, на которую ссылается указатель х, присваиваем значение переменной, на которую ссылается указатель y */

*x =*y;

/*переменной, на которую ссылается указатель y, присваиваем значение из буфера */

*y = c;

 

return;

}

 

Рассмотрим другую программу, в которой осуществляется обмен значений переменных, но с применением ссылок.

 

/* программа # 1.3 */

 

void swap(int &, int &); // прототип функции

 

void main()

{

int a = 10,b = 20;

 

swap (a, b);

}

 

/*эта функция выполняет обмен значений переменных */

void swap(int &x, int &y)

{

int c;

 

c = x;

x =y;

y = c;

return;

}

 

Нетрудно видеть, что такая программа читаться легче (нет операции снятия ссылки ‘*’ как в операциях с указателями).

По ссылке можно передать любой объект, что относится не только к к базовым типам данных (int, long, float, double), но и структурам и классам.

Из вызова swap (a, b);, однако, не ясно, как передаются параметры функции: по ссылке или по значению? На этот вопрос отвечает прототип функции

 

void swap(int &, int &);,

 

из которого следует, что передаются ссылки, которые в неявном виде содержат адреса переменных, вследствие чего и происходит обмен значениями. Однако в операторах присваивания

c = x;

x =y;

y = c;

 

мы работаем со ссылками как с обычными переменными.

Еще один пример. Если в программе имеется указатель на объект какого-то типа, допустим MyObject:

 

MyObject *P = new MyObject();,

то можно создать ссылку на этот объект оператором:

 

Myobject &Ref = *P;.

Хотя переменная Ref ре­ально является указателем, а не самим объектом, но работа с ней производится как с обычным объектом. Так, если вы хотите получить доступ к некоторому свойству объекта х, то через указатель на объект вы обеспечиваете доступ выражением Р -> х, т.е. через операцию стрелка. А через ссылку вы обеспечиваете доступ к свойству х выражением Ref.x, т.е. через операцию точка. Ссылка — это специальный тип указателя, который позволяет работать с ука­зателем как с объектом.

Аналогичным образом вы можете получить доступ по ссылке и к любым компонентам среды программирования С++Builder. Например, если в приложении имеется метка Label1, то Вы можете обращаться к свойству Caption оператором

Label1->Caption = ”Это обращение по указателю”;

А можете ввести соответствующую ссылку и обращаться через нее:

TLabel & ref = *Labell;
ref.Caption - "Это обращение по ссылке";

<== предыдущая лекция | следующая лекция ==>
Методы увеличения производительности скважин | Тема 08. Свойства, закономерности и динамика управления
Поделиться с друзьями:


Дата добавления: 2014-01-05; Просмотров: 341; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.137 сек.