Недоліки класу String
При вивченні попередніх тем ми створювали чимало версій класу String. Всі ці версії насправді не є оптимальними. Добре було б, напевно, перезавантажити оператор присвоювання, тоді можна було б присвоювати значення одного об’єкту класу String іншому за допомогою виразу
s2=s1;
Але, якщо ми насправді перезавантажимо оператор присвоювання, постане питання, що ж робити з реальними рядками (тобто масивами символьного типу char), які є принциповими елементами даних для класу String.
Можна зробити так, щоб кожен об’єкт мав спеціально відведене «місце» для зберігання рядка. Тоді, присвоюючи один об’єкт класу String іншому, ми просто копіюємо рядок з вихідного об’єкту в об’єкт призначення, Але, якщо ми хочемо економити пам’ять, то зручніше працювати не з самими рядками, а з вказівниками на них. Тепер, присвоюючи значення одного об’єкта іншому, ми копіюємо тільки вказівник з одного об’єкту в інший. Обидва вказівники, звичайно, вказуватимуть на той сам рядок. При цьому ми зберігаємо в пам’яті тільки один екземпляр кожного рядку.
Але при цьому треба уважно слідкувати за видаленням об’єктів класу String. Якщо деструктор цього класу використовує delete для вивільнення пам’яті, зайнятої символьним рядком, і якщо є кілька вказівників на цей рядок, об’єкти так і залишаться з «завислими» вказівниками, вказуючими на місце, де давно нема рядка.
Отже, для того, щоб використовувати вказівники на рядки в об’єктах класу String, необхідно слідкувати за тим, скільки саме об’єктів вказує на певний рядок. Тим самим ми можемо уникнути використання delete по відношенню до рядків до того часу, поки не буде видалений останній рядок, який вказує на цей рядок. Спробуємо реалізувати цю ідею в прикладі 22.17.
Дата добавления: 2015-08-26; просмотров: 650;