Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






  • Листинг 9.6. Передача аргументов как ссылок с помощью указателей






    1: // Листинг 9.6. Пример передечи аргументов как ссылок

    2:

    3: #include < iostream.h>

    4:

    5: void swap (int *x, int *y)

    6:

    7: int main()

    8: {

    9: int x = 5, у = 10;

    10:

    11: cout < < " Main. Before swap, x: " < < x < < " у: " < < у < < " \n";

    12: swap(& x, & y);

    13: cout < < " Main. After swap, x: " < < x < < " у: " < < у < < " \n";

    14: return 0;

    15: }

    16:

    17: void swap (int *px, int *py)

    18: {

    19: int temp;

    20:

    21: cout < < " Swap. Before swap, *рх: " < < *px < < " *py: " < < *py < < " \n";

    22:

    23: temp = *px;

    24: *px = *py;

    25: *py = temp;

    26:

    27: cout < < " Swap. After swap, *px: " < < *px < < " *py: " < < *py < < " \n";

    28:

    29: }

     

    Результат:

    Main. Before swap, x: 5 y: 10

    Swap. Before swap, *px: 5 *py: 10

    Swap. After swap, *px: 10 *py: 5

    Main. After swap, x: 10 y: 5

     

    Анализ: Получилось! В строке 5 изменен прототип функции swap() где в качестве параметров объявляются указатели на значения типа int, а не сами переменные типа int. При вызове в строке 12 функции swap() в качестве параметров передаются адреса переменных x и у.

    В строке 19 объявляется локальная для функции swap() переменная temp, которой вовсе не обязательно быть указателем: она будет просто хранить значение *px (т.е. значение переменной x в вызывающей функции) в течение жизни функции. После окончания работы функции переменная temp больше не нужна.

    В строке 23 переменной temp присваивается значение, хранящееся по адресу px. В строке 24 значение, хранящееся по адресу px, записывается в ячейку с адресом py. В строке 25 значение, оставленное на время в переменной temp (т.е. исходное значение, хранящееся по адресу px), помещается в ячейку с адресом py.

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

     

     

    Передача ссылок в функцию swap()

     

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

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






    © 2023 :: MyLektsii.ru :: Мои Лекции
    Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
    Копирование текстов разрешено только с указанием индексируемой ссылки на источник.