В c ++ что означает тильда «~» перед именем функции?


137
 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 ;  
 } ;

Ответы:


152

Это деструктор, он уничтожает экземпляр, освобождает память и т. Д. И т. Д.

Вот описание с ibm.com:

Деструкторы обычно используются для освобождения памяти и другой очистки объекта класса и его членов, когда объект уничтожается. Деструктор вызывается для объекта класса, когда этот объект выходит из области видимости или явно удаляется.

См. Https://www.ibm.com/support/knowledgecenter/en/ssw_ibm_i_74/rzarg/cplr380.htm.


1
Эта ссылка сейчас не работает.
zenofpython

2
@zenofpython Исправлено!
inanutshellus

76

Как уже отмечали другие, в случае, когда вы спрашиваете об этом, является деструктором class Stack.

Но отвечая на ваш вопрос именно так, как он указан в заголовке:

В c ++ что означает тильда «~» перед именем функции?

есть другая ситуация. В любом контексте, кроме непосредственно перед именем класса (который является контекстом деструктора), ~является оператором дополнения (или побитовым). Конечно, это происходит не очень часто, но вы можете представить себе такой случай

if (~getMask()) { ...

которая похожа, но имеет совершенно другое значение.


8

Это деструктор. Функция гарантированно вызывается, когда объект выходит из области видимости.


2
... если он размещен в стеке. Когда 'delete' вызывается для объекта, если он размещен в куче.
Jherico

@Jherico: На самом деле это когда используется ключевое слово «удалить». Помните, что ключевое слово «new» вызывает «оператор new», а затем вызывает конструктор по возвращаемому адресу, поэтому вполне возможно «новую» память в стеке. :) Ключевое слово "delete" вызывает деструктор, а затем вызывает "оператор удаления".
Трубадур

@Jherico или находится в области имен или является статическим членом класса или локальной функцией-статической переменной: статическая продолжительность хранения. Другими словами: все файлы с автоматическим хранением будут автоматически уничтожаться, когда это необходимо. Остерегайтесь статического порядка инициализации Fiasco
Sehe

4

Это деструктор. Вызывается, когда объект уничтожен (вне сферы действия или удален).

Чтобы было понятно, вы должны использовать ~ NameOfTheClass как для конструктора, другие имена недопустимы.


2
"другие имена действительны"?
Гонки легкости на орбите

Старый ответ ... Я думаю, я имел в виду, что после ~ это может быть любое имя, если оно совпадает с именем класса и именем конструктора.
Klaim

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.