В 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.

inanutshellus
источник
1
Эта ссылка сейчас не работает.
zenofpython
2
@zenofpython Исправлено!
inanutshellus
76

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

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

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

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

if (~getMask()) { ...

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

dmckee --- котенок экс-модератора
источник
8

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

Сэмюэл Даниэльсон
источник
2
... если он размещен в стеке. Когда 'delete' вызывается для объекта, если он размещен в куче.
Jherico
@Jherico: На самом деле это когда используется ключевое слово «удалить». Помните, что ключевое слово «new» вызывает «оператор new», а затем вызывает конструктор по возвращаемому адресу, поэтому вполне возможно «новую» память в стеке. :) Ключевое слово "delete" вызывает деструктор, а затем вызывает "оператор удаления".
Трубадур
@Jherico или находится в области имен или является статическим членом класса или локальной функцией-статической переменной: статическая продолжительность хранения. Другими словами: все файлы с автоматическим хранением будут автоматически уничтожаться, когда это необходимо. Остерегайтесь статического порядка инициализации Fiasco
Sehe
4

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

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

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

Это деструктор. Этот метод вызывается, когда экземпляр вашего класса уничтожается:

Stack<int> *stack= new Stack<int>;
//do something
delete stack; //<- destructor is called here;
пьер
источник
1

Это был бы деструктор (освобождая любую динамическую память)

maxfridbe
источник