Що означає c ++, що означає тильда "~" перед назвою функції?


136
 template <class T>
 class Stack
 {
 public:
    Stack(int = 10) ; 
    ~Stack() { delete [] stackPtr ; }  //<--- What does the "~" signify?
    int push(const T&); 
    int pop(T&) ;  
    int isEmpty()const { return top == -1 ; } 
    int isFull() const { return top == size - 1 ; } 
 private:
    int size ;  
    int top ;  
    T* stackPtr ;  
 } ;

Відповіді:


151

Це деструктор, він руйнує екземпляр, звільняє пам'ять тощо.

Опис з ibm.com:

Деструктори зазвичай використовуються для розміщення пам’яті та інших очищень для об’єкта класу та його членів класу, коли об’єкт знищується. Деструктор викликається об’єктом класу, коли цей об'єкт виходить із сфери застосування або явно видаляється.

Дивіться https://www.ibm.com/support/knowledgecenter/en/ssw_ibm_i_74/rzarg/cplr380.htm


1
Зараз це посилання розірвано.
zenofpython

2
@zenofpython Виправлено!
inanutshellus

75

Як зазначали інші, у випадку, коли ви запитуєте про це, це деструктор class Stack.

Але поставивши своє запитання саме так, як це відображено в заголовку:

Що означає c ++, що означає тильда "~" перед назвою функції?

є інша ситуація. У будь-якому контексті, крім безпосередньо перед назвою класу (що є контекстом деструктора), ~є оператором доповнення (або побітовим чином). Щоб бути впевненим, це не дуже часто, але ви можете уявити собі подібний випадок

if (~getMask()) { ...

що схоже, але має зовсім інше значення.


8

Це руйнівник. Гарантована функція викликається, коли об'єкт виходить за межі області.


2
... якщо його виділено на стек. Коли "delete" викликається об'єктом, якщо його виділено на купі.
Jherico

@Jherico: Насправді саме тоді використовується ключове слово "delete". Пам'ятайте, що ключове слово "новий" викликає "оператора новий", а потім викликає конструктор за поверненою адресою, так що цілком можливо "нову" пам'ять у стеку. :) Ключове слово "delete" викликає деструктор і потім викликає "оператор видалити".
Трубадур

@Jherico або живе в області простору імен або є статичним членом класу або локальною функцією статичної змінної: статична тривалість зберігання. Іншими словами: всі змінні елементи з автоматичним зберіганням автоматично будуть знищені, коли це доречно. Остерігайтеся статичної ініціалізації замовлення Fiasco
sehe

4

Це деструктор. Він називається, коли об’єкт знищений (поза сферою життя або видалений).

Щоб було зрозуміло, ви повинні використовувати ~ NameOfTheClass, як для конструктора, інші назви недійсні.


2
"інші імена дійсні"?
Гонки легкості по орбіті

Стара відповідь ... Я думаю, я мав на увазі, що після ~ це може бути будь-яке ім'я, доки це те саме, що ім'я класу та ім'я конструктора.
Клаїм

2

Це руйнівник. Цей метод викликається, коли екземпляр вашого класу знищений:

Stack<int> *stack= new Stack<int>;
//do something
delete stack; //<- destructor is called here;

1

Це був би деструктор (звільнення будь-якої динамічної пам'яті)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.