|
Программирование >> Расширенная версия языка c++
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
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |