![]() |
|
Программирование >> Расширенная версия языка c++
522 Самоучитель C++ cou-=- *р \п; return 0; 1. #include <io3tream> using namespace std; void rneg(in ); версия функции со ссылкой void pnegdnt *i); версия функции с указателем int main О . . int i = 10; int j = 20; rneg(i); pnegt&j); cou< j Лп; return 0; использование параметра-ссыпки void rneg (int ii) i = - i; / использование параметра-указателя void pnttgiint *i) 2. При вызове функции ]e() адрес d получен явно, посредством оператора &. Это ненужно и неправильно. При использовании ссьшки в качестве параметра перед аргументом не ставится оператор &. 3. Адре а-ссылки передается в функцию автоматически. Для получения адреса нет необходимости производить какие бы то ни бгло действия. Передача по ссылке быстрее, чем передача по значению. При передаче по ссглке не делается копии аргумента и поэтому не бывает сторонних эффектов, связанных с вызовом деструктора копии. , , Приложение В. Ответы осы и решение нений 523 1. В исходной программе объект передается в функцию show() по значению. Поэтому делается его копия. Когда функции w() возвращает свое значение, копия удаляется и при этом вызывается деструктор копии, Эго приводит к ос-вобожцению памяти, на которую указывает указатель р, но освобожценная память все еще необходима аргументам функции w(). Здесь представлена правильная версия программы, в которой, для того чтобы предотвратить появление копии при вызове функции, в качестве параметра используется ссылка: Теперь программа исправлена ttinclude <iostream> , ..i . ttinclude <cstring> ttinclude <cstdlib> using namespace std; clas type { char *p; public: ; strtype(char *s) ; . -strtype 0 { delete [.: } cha t() ( return p; } }; - strtype::strtype(char *з) int 1; i .: . 1 = strlen(s) + 1; p = new char [1] ; if(;p) 1 cou Обка выделения памятиХп ; exit(1); strcpy{p, s) ; Проблема решена с помощью параметра-ссылки char *s; s = x.get 0 ; cout s \n ; ) int inain() strtype a ( Привет ), b ( Здесь ); Самоучитель C++ show(а); show(b); return 0; 4.8 1. Пример защищенного двумерного массива #include <iostream> ttinclude<cstdlib> - using namespace class array ( int isize, jsize; int *p; .. . public : i, int intsput[int i, int j); int get (int i, int j) ; array; : array (int i, int j) { p = new int [ i * j ] ; . . . if(!p) ( cout Опшбка выделения памятиХп ; , .j- exit(l); isize = i; jsize = j; Запись значения в массив int fiarray: -.put (int i, int j) i if{i<C I I i>=isize ! j<0 I lj>=jsize) { cou << Обка, нарушены границы массива! ! ! \n ; exitd ) ; return jsize i!; возврат ссылки на p[ i ] Получение значения из массива in ;get(int i, int j) ( if (i<0 I I i>=isize I I j<0 I size) I cou < Обка, нарушены границы массива! ! !\n ; exit (1 ) ;
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |