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

1 ... 23 24 25 [ 26 ] 27 28 29 ... 227


return 0;

Несмотря на то что класс lass class физически одинаковы, они трактуются компилятором как разные, поскольку имеют разные имена типов.

2. Важно понимать, что все данные-члены одного объекта при выполнении присваивания присваиваются данным-членам другого объекта. Это относится и к сложным данным, таким как массивы. Например, в следующей версии уже знакомого нам класса stack символы реально помещаются только в стек si, но после выполнения присваивания массив stck объекта s2 также содержит символы a, b и с.

ttinclude <iostream> ..... . .

using namespace std;

Idefine SIZE 10

Объявление класса stack для символов class stack { . , -.

cha SIZE] ; содержит стек ...j.

in s; индекс вершины стека ,

public:

конструктор

voi ar ch) ; помещает в стек символ char pop О; выталкивает символ из стека

/ млизация стека stack::stack()

cou Работа конструктора стека\п ;

tos =0; ,

Помещение символа в стек voi ush{char ch)

cou << Стек полон \п ; return;

stck[tos] = ch; tos++;

о2 ol; ОШИБКА, присваивание объектов ных типов

о1. show () ;

о2 . show () ; I ... ;



3. При присваивании одного объекта другому необходимо быть очень внимательным. Например, рассмотрим несколько измененный класс strtype, который мы изучали в главе 2. Попытайтесь найти ошибку в этой программе.

Эта программа содержит ошибку ttinclude <iostream>

ttinclude <cstring> - . й;. . i- .

ttinclude <cstdlib> - . м - . . -t:-- .

using namespace std; -; i

class strtype { , : f,

char *p; . ,

int len; ч -.!

public: 1 ,

strtype(char *ptr); ~strtype(); , , ; ,

void ShowO; .li.- - .

}; ......

, Выталкивание шола из стека char stack: :рор()

if (tos=0) { - ..

cou Сгек ст \n ;

return 0; возврат нуля при стом стеке

tos-;

return stck[tos];

int main (J ,

Образование двух, автоматически инициализируемых стеков

stack si, s2;

inti;

si.push( a) ; .

si.push ( b) ; sl.push(c) ;

копирование в s2 si; теперь s2 si идентична!

for(i=0; i<3; i << свол из si: sl.popO

\n ;

for(i=0; i<3; cou сол <- s2.pop()

- \n ;

return 0;



strtype: :strtype(char *ptr)

(

len=strlen(ptr) ;

p=(char *} malloc (len+1) ; .

if(!p) { -I T

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

strcpy (p, ptr} ; .: :

strtype::-strtype(}

cout Освобождение памяти по адресу p\n ; .i-free(p) ;

void strtype: : show{)

cout p - длина: len; cout \n ;

} -.

int main () f

strtype si( Это проверка ), з2( Мне нравится С++ )

si. show () ; s2.show О ;

аивается s2 - это ведет к ошибке в2 = si;

si. show() ; : . i

s2 . show( ) ; -

return 0;

Ошибка в этой программе весьма коварна. Когда создаются объект! и s2, то для хранения в этих объектах строк выделяется память. Указатель на выделенную каждому объекту память хранится в переменной р. Когда объект strtype удаляется, эта память освобождается. Однако когда объект si присваивается объекту s2, то указатель р объекта s2 начинает указывать на ту же самую область памяти, что и указатель р объекта si. Таким образом, когда эти объекты удаляются, то память, на которую указывает указатель р объекта si, освобождается дважды, а память, на которую до присваивания указывал указатель р объекта s2, не освобождается вообще.

Хотя в данном случае эта ошибка и не опасна, в реальных программах с динамическим распределением памяти она может вызвать крах программы. Как показано в этом примере, при присваивании одного объекта другому вы



1 ... 23 24 25 [ 26 ] 27 28 29 ... 227

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