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

1 ... 169 170 171 [ 172 ] 173 174 175 ... 227


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 ) ;



1 ... 169 170 171 [ 172 ] 173 174 175 ... 227

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