C++ Программирование в среде С++ Builder 5


Ссылки - часть 3


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

Передавая параметры по ссылке, нужно всегда помнить о возможных побочных эффектах. Если только функция не должна явно изменять значение своего аргумента, лучше объявить параметр как ссылку на константу (например, const int SiVal). Тогда при попытке присвоить параметру значение в теле функции компилятор выдаст сообщение об ошибке.

Ссылка в качестве возвращаемого значения

Возвращаемое функцией значение также может быть объявлено ссылкой. Это позволяет использовать функцию в левой части присваивания. Рассмотрите такой пример:

////////////////////////////////////////////////////////

// массива.

//

#include <stdio.h>

#include <assert.h>

const int arrSize = 8;

int &refItem(int indx)

// Возвращает ссылку на элемент

//

iArray[indx] {

static int iArray[arrSize];

//

// Проверка диапазона:

//

assert(indx >= 0 && indx< arrSize);

return iArray[indx];

}

int main(void) {

int i;

for (i=0; .KarrSise; i++)

refltem(i) = 1 << i;

// Присваивает значение элементу

// iArray[i].

for (i=O; i<arrSize; i++)

printf("iArray[%02d] = %4d\n'\ i, refltem(i));

refltem(i) = 0; // Попытка выхода за пределы

// массива.

return 0;

}

В первом из операторов for функция refltem() вызывается в левой части присваивания. Во втором for она возвращает значение, которое передается функции printf (). Обратите внимание, что, во-первых, массив iArray[] объявлен как статический локальный в refltem(), благодаря чему непосредственное обращение к нему вне этой функции невозможно. Во-вторых, refltem() попутно проверяет допустимость переданного ей индекса. Ссылка позволяет на элементарном уровне организовать механизм, который мы в следующей главе назовем сокрытием или абстрагированием данных.




Начало  Назад  Вперед