Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Клас String з використанням операції new

Поиск

Операція 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, буде повернута системі при знищенні об’єкту, а не залишиться невизначеною.

 

Вказівники на об’єкти

Вказівники можуть вказувати на об’єкти так само, як і на прості типи даних чи масиви.

Раніше ми часто писали оголошення об’єктів у вигляді

Distance dist;

де визначений об’єкт класу Distance.

Однак в деяких випадках на момент написання програми нам невідома кількість об’єктів, які необхідно створити. Тоді ми можемо використати операцію new для створення об’єктів під час роботи програми. Як ми бачили, операція new повертає вказівник на неіменований об’єкт. Розглянемо два підходи до створення об’єктів на прикладі програми 12.17.

 #include<iostream.h>

 #include<conio.h>

 #include<stdio.h>

 #include<bios.h>

 class Distance

 {private:

 int feet;

 float inches;

 public:

 void getdist()

 {cout<<"\nВведіть фути";cin>>feet;

 cout<<"\nВведіть дюйми";cin>>inches;

 }

 void showdist()

 {cout<<feet<<"\'="<<inches<<'\"';}

 };

 /////////////

 int main()

 {clrscr();

 Distance dist;

 dist.getdist();

 dist.showdist();

 

  Distance* distptr;

  distptr=new Distance;

 distptr->getdist();

 distptr->showdist();

 cout<<endl;

 bioskey(0);

 return 0;

 }

Програма 12.17

 

Перший об’єкт в цій програмі створюється звичайним способом, натомість другий – з використанням операції new, яка повертає вказівник на нього.

Виникає питання: як ми посилаємося на методи класу з об’єкту, на який вказує disptr? Звичний для нас синтаксис з використанням крапки

disptr.getdist();

працювати не буде: операція крапки вимагає, щоб ідентифікатор зліва був змінною. Оскільки disptr – вказівник на змінну, то в цьому випадку використовується інший синтаксис. Це інший випадок використання операції розіменування (операції одержання вмісту змінної, на яку вказує вказівник.

Допустимим є такий спосіб:

(*disptr).getdist();

Але це дещо незграбно через дужки, які необхідні тому, що операція крапки має вищий пріоритет, ніж операція розіменування. Еквівалентний, але коротший спосіб запису надається операцією доступу до членів класу:

distptr->getdist();

Існує інший спосіб створення нового об’єкту, який дозволяє використовувати операцію крапки:

Distance& dist=*(new Distance);

але він використовується рідше.

 



Поделиться:


Последнее изменение этой страницы: 2021-12-15; просмотров: 56; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.191.37.129 (0.005 с.)