Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
14
Добавлен:
17.04.2015
Размер:
28.48 Кб
Скачать

Лекция. Ссылки.

План лекции.

    1. Определение и задание ссылок.

    2. Правила ипользования ссылок

    3. Передача параметров в С.

    4. Передача параметров по ссылке.

    5. Отличие ссылок от указателей.

    6. Использование ссылок.

    7. Что нельзя делать со ссылками.

    8. Ссылки и массивы

    9. Примеры на использование ссылок.

        1. Определение и задание ссылок.

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

Формат объявления ссылки:

тип & имя;

где тип — это тип величины, на которую указывает ссылка, & — оператор ссылки, означающий, что следующее за ним имя является именем переменной ссылочного типа, например:

int коl:

int& pal = kol; // ссылка pal - альтернативное имя для коl

const char& CR = ' \ n ' : // ссылка на константу

Объявление ссылок очень похоже на объявление указателей, только вместо звёздочки «*» нужно писать амперсанд «&».

                1. Правила для ссылок.

• Переменная-ссылка должна явно инициализироваться при ее описании, кроме

случаев, когда она является параметром функции, описана как extern или ссылается на поле данных класса .

• После инициализации ссылке не может быть присвоена другая переменная.

• Тип ссылки должен совпадать с типом величины, на которую она ссылается.

• Не разрешается определять указатели на ссылки, создавать массивы ссылок и

ссылки на ссылки.

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

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

3. Передача параметров в Си.

В Си аргументы всегда передаются единственным образом, часто называемым «передачей по значению». Например, пусть есть функция

void foo (int x)

{

x = 17;

}

Мы можем вызывать её любым из следующих способов:

int main ()

{

int z = 5;

foo (z);

foo (z + 1);

foo (125);

}

Разумеется, ни один из этих вызовов не изменяет значения переменной z. (Для последних двух вызовов это совершенно естественно, а вот в первом случае вы могли засомневаться.)

Что же делать, если мы хотим дать возможность функции foo изменять значение переданной переменной? Мы можем передать ей не саму переменную, а указа-тель (и для C, и для C++). Перепишем предыдущий пример так:

void foo (int *x)

{

*x = 17;

}

Int main ()

{

int z = 5;

foo (&z);

/* остальные варианты больше не имеют смысла */

/* z теперь равно 17 */

}

Такая передача аргументов, однако, опасна: легко забыть звёздочку в теле функ-ции foo или амперсанд — в её вызове. Представьте себе, что foo состоит из 1234 строк, и везде, где употребляется x, нужна звёздочка. А ещё она вызыва-ется 56 раз в разных местах программы — при этом иногда нужен амперсанд, иногда нет. Это — стандартная ситуация для реальных, а не учебных, программ. Итак, указатели опасны, а передача параметров по указателю опасна вдвойне (утверждение спорное и зависит от вкуса разработчика. Некоторые разработ-чики, напротив, предпочитают наличие амперсанда в f(&obj) как подсказки о том, что значение obj может измениться внутри вызова).