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

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


На занятии 5 вы узнали, что параметры, передаваемые функции, помешаются в стек. Если функции передается значение как ссылка (с помощью либо указателей, либо ссылок), то в стек помещается не сам объект, а его адрес.

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

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

Вспомните, что в листинге 5.5 (см. Занятие 5) демонстрировалось, что после обращения к функции swapO значения в вызывающей функции не изменялись. Исключительно ради вашего удобства этот листинг воспроизведен здесьеше раз (листинг 9.5).

Листинг 8.5. Демонстрация передачи по зиачению

2 3 4 5 6 7 8 9

10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29

Листинг 9,5, Передача параметров как значений

((include <iostream,h>

void swap(int x, int y);

int main() {

int X = 5, у = 10;

cout Main, Before swap, x: x y: у \ n swap(x,y):

cout Main, After swap, x: x y: у \ n ; return 0;

void swap (int x, int y) {

int temp;

cout << Swap, Before swap, x: << x << y: << у << \ n

temp = x; X = y; у = tomp;

cout << Sw(4[), After swap, x: << x << y: << у << \ n ;

Mam. Before swap, x: 5 у Swap. Belore swap, x: 5 у Swap. After swap, x: 10 у

10 10 5

Main, After swap, x: 5 y: 10



Эта программа инициализирует две переменные в функции main(), а затем передает их функции awapO, которая, казалось бы, должна поменять их значения. Однако после повторной проверки этих переменных в функции mainO оказывается, что они не изменились.

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

В языке С++ существует два способа решения этой проблемы: можно сделать параметры функции swapO указателями на исходные значения или передать ссылки на исходные значения.

Передача дказателеП в фднкцию swapl)

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

Лисшииг В.б. Передача аргуменшип как ссылок с оомощью указаоюдеО

2 3 4 5 6 7 8 9

10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29

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

#include <iostream,h>

void swap(int *x, int *y);

int mainO {

int X = 5, у = 10;

cout Main, Before swap, x: x y; у << \ n ; swap(&x,&y);

cout Main, After swap, x: x y: у \ n ; return 0; }

void swap (int рх, int ру) {

int temp;

cout Swap, Before swap, рх; рх << *py: *py \ n

temp .px; .px = .py; .py = temp;

cout << Swap, After swap, рх: << *px << *py: ру << \ n ;



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 изменен прототип функции swapO где в качестве параметров объявляются указатели на значения типа int, а не сами переменные типа int. При вызове в строке 12 функции swap() в качестве параметров передаются адреса переменных х и у.

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

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

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

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

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

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

Листинг В.7. Та же функция swap(), но с исноАьзованием ссылок

2 3 4 5 6 7 8 9

10 11 12 13 14

Листинг 9,7. Пример передачи аргументпя ссылок с помощью ссылок!

Sinclude <iostream.h>

void swapdnt &x, int &y);

int mainO {

int X = 5, у = 10:

cout << Main. Before swap, x: << x << y: << у << \ n ; swap(x,y);

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



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

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