Программирование >>  Дополнительные возможности наследования 

1 ... 72 73 74 [ 75 ] 76 77 78 ... 265


15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

return 0;

void swap (int &rx, int &ry) {

int temp;

cout << Swap. Before swap, rx; << rx << ry, << ry \ n

temp = rx; rx = ry; ry = temp;

cout << Swap, After swap, rx: << rx ry: << ry << \ n ;

Main. Before swap, x:5 y: 10 Swap. Before swap, rx:5 ry:10 Swap. After swap, rx:10 ry:5 Main, After swap, x:10, y:5

Точно так же, как и в примере с указателями, в строке 10 объявляются две переменные, а их значения выводятся на экран в строке 12. В строке 13 вызывается функция swapO, но обратите внимание на то, что ей передаются именно значения х и у, а не их адреса. Вызывающая функция просто передает свои переменные.

После вызова функции swap() выполнение профаммы переходит к строке 18, в которой эти переменные идентифицируются как ссылки. Их значения выводятся на экран в Сфо-ке 22, но заметьте, что для этого не требуется никаких специальных операторов, поскольку мы имеем дело с псевдонимами для исходных значений и используем их в этом качестве.

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

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

В листинге 9.6 показана функция swapO, использующая в качестве аргументов указатели, а в листинге 9.7 - та же функция, но с использованием ссылок. Использовать функцию, которая принимает в качестве параметров ссылки, легче, да и в профамме такая функция проще читается, но как вызывающей функции узнать о том, каким способом переданы параметры - по ссылке или по значению? Будучи клиентом (или пользователем) функции swap(), профаммист должен быть уверен в том, что функция swapO на самом деле изменит параметры.

�61984



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

Если бы функция SwapO была функцией-членом класса, то объявление этого класса, также расположенное в файле заголовка, обязательно содержало бы эту информацию,

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

Когда Колонел Джон Роблинг (Colonel John Roebling) проектировал свой Бруклинский мост (Brooklyn Bridge), он интересовался деталями процесса литья и изготовления проводов. Он глубоко вникал в подробности механических и химических процессов, которые требовалось обеспечить для создания необходимых материалов. Но в наши дни инженеры более эффективно используют свое рабочее время, доверяя информации о строительных материалах и не интересуясь подробностями их изготовления.

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

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

Возвращение нескилькнх значвннй

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

И вновь одинакового результата можно достичь, используя как ссылки, так и указатели. В листинге 9.8 показана функция, которая возвращает три значения: два в виде параметров-указателей и одно в виде возвращаемого значения функции.

дисшина В.В. Возвращение значений с помощью указаталвО

Листинг 9,8,

Возвращение нескольких значений из функции с помощью указателей

#include <iostream.h> int

short Factor(int n, int pSquared, int* pCubed): int mainO



12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41

inl number, squared, cubed; short error;

cout Enter a number (0 - 20): ; Gin >> number:

error = Factor(number, &squared, &cubed);

if (!error) {

cout << number: << number << \ n ; cout << square: << squared << \ n ; cout << cubed: << cubed \ n ;

else

cout << Error encountered!!\ n ; return 0;

short Factordnt n, int .pSquared, int .pCubed) {

short Value = 0; if (n > 20)

Value = 1; else {

♦pSquared = n*n; *pCubed = n*n n; Value = 0;

return Value;

Enter a number (0-20): 3 number, 3 square: 9 cubed: 27

В строке 10 переменные number, squared и cubed определяются с использованием типа int. Переменной number присваивается значение, введенное пользователем. Это значение, а также адреса переменных squared и cubed передаются функции FactorO в виде параметров,

В функции FactorO анализируется первый параметр, который передается как значение. Если он больше 20 (максимальное значение, которое может обработать эта функция), то возвращаемое значение Value устанавливается равным единице, что служит признаком ошибки. Обратите внимание на то, что возвращаемое значение из функции FactorO может принимать либо значение 1, либо О, являющееся признаком того, что все прошло нормально, а также заметьте, что функция возвращает это значение лишь в строке 40,



1 ... 72 73 74 [ 75 ] 76 77 78 ... 265

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика