|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Использование конструкторов и деструкторов для выделения и освобождения свободной памяти
// newstr.cpp
// использование оператора new для выделения памяти под строку class String { private: char* str; // указатель на строку public: String (char* s) // конструктор с одним параметром { int length = strlen (s); // вычисляем длину строки str = new char [ length + 1 ]; // выделяем необходимую память strcpy (str, s); // копируем строку } ~String () // деструктор { cout << "Удаляем строку\n"; delete [ ] str; // освобождаем память } void display () // покажем строку на экране { cout << str << endl; } }; /////////////////////////////////////////////////////////// int main () { String s1 = "Тише едешь – дальше будешь."; cout << "s1 = "; s1.display ();
return 0; } Результат работы программы будет следующим: S1 - Тише едешь - дальше будешь.
Класс String имеет только одно поле str, являющееся указателем на char. Он будет указывать на строку, содержащуюся в объекте класса String. Здесь не будет массива, содержащего строку. Строка хранится в другом месте, а в классе String есть только указатель на нее.
Конструктор в программе newstr Конструктор в этом примере имеет один аргумент: указатель на строку char*. С его помощью, используя операцию new, выделяется память для строки, на которую будет указывать указатель str. Затем конструктор использует функцию strcpy() для копирования строки в выделенный участок памяти.
Деструктор Мы нечасто использовали деструктор в наших примерах, но теперь он нам необходим для освобождения памяти, выделенной с помощью операции new. При создании объекта мы выделяем для него память, и будет вполне разумным освободить эту память после того, как объект уже использован. деструктор — это функция, которая вызывается автоматически при удалении объекта. В программе NEWSTR деструктор выглядит следующим образом: ~String() cout << "Удаляем строку.\n"; } Деструктор возвращает системе память, выделенную при создании объекта. Мы можем вывести в конце программы сообщение о том, что деструктор выполнил свою функцию. Объекты (как и другие переменные) обычно уничтожаются, когда функция, в которой они определены, заканчивает свою работу. Деструктор гарантирует, что память, выделенная для объекта класса String, будет возвращена системе при уничтожении объекта, а не останется неопределенной. Мы должны заметить, что при использовании деструктора, как это показано в примере NEWSTR, могут возникнуть некоторые проблемы. При копировании одного объекта класса String в другой в строке s1-s2 в действительности происходит копирование указателя на реальную строку. Теперь оба объекта указывают на одну и ту же строку. При удалении строки деструктор удалит один указатель на строку, а указатель другого объекта будет указывать уже на что-то другое. Мы можем этого не заметить, так как процесс удаления объектов для нас невидим, например когда заканчивает свою работу функция, в которой был создан локальный объект.
Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.003 сек.) |