Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Data Structures and Algorithms in C++ 2e (На ру...docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.37 Mб
Скачать

1.4. Функции 29

функция. В вышеупомянутом примере формальный аргумент «n» инициализирован к фактическому

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

Иногда для функции полезно изменить один из своих аргументов. Чтобы сделать так, мы можем явно определить формальный аргумент, чтобы быть справочным типом (как введено в Разделе 1.1.3). Когда мы делаем это, любые модификации, сделанные к аргументу в функции, изменяет соответствующий фактический аргумент. Это называет, передавая аргумент ссылка. Пример показывают ниже, куда один аргумент передан стоимостью, и другой передан ссылкой.

пустота f (международная стоимость, int& касательно)

стоимость ++;

касательно ++; суд <<стоимость <<endl; суд <<касательно <<endl;

//

// // // //

одна стоимость и одна ссылка

никакой эффект на фактический аргумент не изменяет фактическую продукцию аргумента 2 продукции 6

международное основное ()

международная кошка = 1;

международная собака = 5; f (кошка, собака); единое время co <<c в <<endl; единое время co <<d o g <<endl; возвратите ВЫХОДНОЙ УСПЕХ;

//встретьте кошку стоимостью, собаку касательно//продукция 1//продукция 6

Заметьте, что изменение аргумента стоимости не имело никакого эффекта на фактический аргумент, тогда как изменение справочного аргумента сделало.

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

Постоянные ссылки как аргументы

Есть серьезное основание для решения пройти мимо структуры и аргументов класса касательно -

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

Так как большинство аргументов функции не изменено, еще лучшая практика должна передать аргумент как «постоянную ссылку». Такая декларация сообщает компилятору

30

Глава 1. C ++ Учебник для начинающих, что, даже при том, что аргумент передается ссылкой, функция не может изменить свою стоимость. Кроме того, функции не позволяют передать аргумент другой функции, которая могла бы изменить ее стоимость. Вот пример, используя немецкую структуру Passen-, которую мы определили ранее в Разделе 1.1.3. Попытка изменить аргумент привела бы к сообщению ошибки компилятора.

пустота someFunction (константа Passenger& проход)

pass.name = «новое имя»; //НЕЗАКОННЫЙ! проход объявлен константой

Сочиняя маленькие программы, мы можем легко избежать изменять аргументы

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

Аргументы множества

Мы обсудили мимолетные большие структуры и классы ссылкой, но что относительно

большие массивы? Был бы, передавая множество результатом стоимости в создании копии всего множества? Ответ нет. Когда множество передано к функции, оно преобразовано в указатель на его начальный элемент. Таким образом, объект типа T [] преобразован, чтобы напечатать T*. Таким образом назначение на элемент множества в пределах функции действительно изменяет фактическое содержание множества. Короче говоря, множества не переданы стоимостью.

К тому же это не значащее, чтобы пасовать назад множество как результат вызова функции. По существу попытка сделать так только передаст указатель на начальный элемент множества. Если возвращение множества является нашей целью, тогда мы должны или явно возвратить указатель или рассмотреть возвращение объекта вектора типа от C ++ Стандартная Библиотека Шаблона.

1.4.2 Overloading и Inlining

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

имя, но чей эффект зависит от типов их фактических аргументов.

Перегрузка функции

Перегрузка функции происходит, когда две или больше функции определены с

то же самое имя, но с различными списками аргументов. Такие определения полезны в situa-tions, где мы желаем двух функций, которые достигают по существу той же самой цели, но делают это с различными типами аргументов.