Операція new часто використовується в конструкторах класів. Для прикладу ми модифікуємо клас String, з яким працювали, вивчаючи перезавантаження операцій. Ми можемо усунути можливий дефект цього класу, що виникає, коли всі його об’єкти займають однакову кількість пам’яті: при цьому замалі рядки даремно витрачають пам’ять, а завеликі можуть не поміститися. В програмі 12.16 ми використаємо операцію new для виділення точної кількості пам’яті.
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<bios.h>
#include<string.h>
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()
{clrscr();
String s1=”Пробна фраза”;
cout<<”s1=”;
s1.display();
return 0;
}
Програма 12.16
(Зверніть увагу, що повністю результат роботи програми можна оглянути, тільки завершивши її і перейшовши у вікно користувача).
Клас String має тільки одне поле str, що є вказівником на char. Він буде вказувати на рядок, що міститься в об’єкті класу String. Тут не буде масиву, який містить рядок. Рядок зберігається в іншому місці, а клас String містить лише вказівник на нього.
Конструктор в програмі 12.16
Конструктор в цьому прикладі має тільки один аргумент: вказівник на рядок char*. З його допомогою, використовуючи операцію new, виділяється пам’ять для рядка, на який буде вказувати вказівник str. Потім конструктор використає функцію strcpy() для копіювання рядка у виділену ділянку пам’яті.
Деструктор в програмі 12.16
Досі ми рідко використовували деструктор, але зараз він нам необхідний для вивільнення пам’яті, виділеної за допомогою операції new. При створенні об’єкту ми виділяємо для нього пам’ять і буде цілком розумним вивільнити її після того, як об’єкт вже використаний.
Деструктор – це функція, яка викликається автоматично при видаленні об’єкту. В програмі 12.16 він виглядає так:
~String()
{cout<<”Видалення рядка\n”;
delete[]str;
}
Деструктор повертає системі пам’ять, виділену при створенні об’єкту. Ми можемо вивести в кінці програми повідомлення про те, що деструктор виконав свою функцію. Об’єкти, як і інші змінні, звичайно знищуються, коли функція, в якій вони визначені, закінчить свою роботу. Деструктор гарантує, що пам’ять, виділена для об’єкту класу String, буде повернута системі при знищенні об’єкту, а не залишиться невизначеною.