Программирование >>  Расширенная версия языка c++ 

1 ... 40 41 42 [ 43 ] 44 45 46 ... 227


4.8. Ссылка в качестве возвращаемого значения функции

Функция может возвращать ссылку. Как вы увидите в главе 6, возвращение ссылки может оказаться полезным при перегрузке операторов определенных типов. Кроме этого возвращение ссылки позволяет использовать функцию слева в инструкции присваивания. Это приводит к важному и неожиданному результату.

1. Для начала, простая программа с функцией, которая возвращает ссылку:

Простой пример ссылки в качества щаеморо значения функции iinclude <iostreain>

using namespace std; . . j , . ,. -ii

1 en(s) +1; , ,

р = new char [1] ;

if(!p) {

cout Опмбка выделения паыяти\п ; exit(l);

strcpy{p, s); , .,

voi trtype x) , ,

char *з;

s et () ; ,

cout S \n ;

int mainO (

strtype аСПривет ), b( Здесь ) ;

show (a); , . .--jz.

3hOw(b) ; ;; t::.

return 0;



136 Самоучитель C++,

int SfO ; .1 - ..

int x;

int main () {

f() = 100; присваивание 100 ссыпке, возвращаемой функцией f() cou< x \n ;

return 0; , -;>

ащение ссылки на целое - . r , .

return x; возвращает ссылку на х

Здесь функция f() объявляется возвращающей ссылку юе. Внутри тела функции инструкция

return

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

f() = 100;

заносит значение 100 в переменную х, поскольку функция f() уже возвратила ссылку на нее.

Повторим, функция f() возвращает ссылку. Когда функция f() указана слева

в инструкции присваивания, то таким образом слева оказывается ссылка на объект, которую возвращает эта функция. Поскольку функция Г() возвращает ссылку на переменную х (в данном примере), то эта переменная х и получает значение 100.

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

Возвращение ссхлки на целое

int &fO

int x; х - локальная переменная

return х; возвращение ссхлки на х

1 - м .if-r,... f..; .

В этом случае х становится локальной переменной функции f() и выходит из

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




амечониё

Некоторые компиляторы C++ не позволяют ащать ссылки на локальные переменные. Тем не менее, эта проблема может проявиться по-другому, например, когда память для объектов выделяется динамически.

3. В качестве возвращаемого значения функции ссылка может оказаться полезной при создании массива определенного типа - так называемого защищенного массива (bounded array). Как вы знаете, в Си C++ контроль границ массива не производится. Следовательно, имеется вероятность при заполнении массива выйти за его границы. Однако С++ можно создать класс массива с автоматическим контролем границ (automatic bounds checking). Любой класс массива содержит две основные функции - одну для запоминания информации в массиве и другую для извлечения информации. Именно эти функции в процессе работы могут проверять, не нарушены ли границы массива.

Следующая программа реализует контроль границ символьного массива:

Пример защищенного массива -

#include <iostreara> ...

finclude <cstdlib> . .

using namespace std;

class array {

int size;

char *p;

public:

array (intnum) ;

- array 0 ( delete [] p; }

cha {int i) ;

cha (int i) ;

); \ .

array: :array (int num) {

p = new char [num] ;

if(!p) ( .

cout Опмбка выделения памяти\п ;

,-r ((

exit(l);

size = num;

Заполнение массива cha :put (int i)

T :

, ;? o



1 ... 40 41 42 [ 43 ] 44 45 46 ... 227

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