|
Программирование >> Расширенная версия языка c++
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, не освобождается вообще. Хотя в данном случае эта ошибка и не опасна, в реальных программах с динамическим распределением памяти она может вызвать крах программы. Как показано в этом примере, при присваивании одного объекта другому вы
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.075
При копировании материалов приветствуются ссылки. |