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

Answers:



75

正如其他人指出的那样,在您要询问的情况下,它是的析构函数class Stack

但是完全按照标题显示您的问题:

在c ++中,函数名称前的波浪号“〜”表示什么?

还有另一种情况。在任何上下文中,除了紧接在类名之前(即析构函数上下文)之外,~都是该类的补码(或按位非)。确保它不会经常出现,但是您可以想象一个类似的情况

if (~getMask()) { ...

看起来很相似,但意义却大不相同。


8

这是一个破坏者。当对象超出范围时,可以确保调用该函数。


2
...如果其分配在堆栈上。如果在对象上分配了'delete',则将其分配在堆上。
Jherico

@Jherico:实际上是使用关键字“ delete”的时候。请记住,关键字“ new”会调用“ operator new”,然后在返回的地址上调用构造函数,因此完全有可能在堆栈上“ new”存储。:)关键字“ delete”调用析构函数,然后调用“ operator delete”。
Troubadour

@Jherico或居住在名称空间范围内,或者是静态类成员或函数局部静态变量:静态存储持续时间。换句话说:所有具有自动存储功能的可折叠物品都将在适当的时候自动销毁。提防静态初始化命令Fiasco
sehe 2012年

4

这是一个析构函数。当对象被销毁(超出生命范围或被删除)时调用。

为了清楚起见,您必须使用〜NameOfTheClass之类的构造函数,其他名称无效。


2
“其他名称有效”吗?
Lightness Races in Orbit,

旧答案...我想我的意思是,〜后可以是任何名称,只要它与类名称和构造函数名称相同即可。
克莱姆(Klaim)2011年

2

是破坏者。当类的实例被销毁时,将调用此方法:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.