C++中“~”(波浪号)符号的含义是什么?

20
// AirlineTicket.h

class AirlineTicket
{
public:
  AirlineTicket();

  ~AirlineTicket();
     
  int          getNumberOfMiles();
    
private:
  int          mNumberOfMiles;
};

我现在想知道这段代码中 ~AirlineTicket(); 的含义是什么?我不知道 ~(波浪线)是什么意思。

7个回答

30

这是析构函数。 当你销毁对象实例(即到达作用域结尾,或者调用delete来释放指向该对象的指针)时,它会被调用。


1
或者当自动删除发生时。 - justkt
17
请注意,在不同的上下文中,符号 ~ 也可以表示按位取反。 - user418748

27

在你使用的上下文中,它定义了一个析构函数。

其他上下文中,比如下面这个例子,它也被称为按位取反(补码):

int a = ~100;
int b = ~a;

输出:(ideone)

-101
100

5
“@Nawaz 这段代码中的 ~AirlineTicket(); 是什么意思?”并不是指“按位取反”,它是一个析构函数。 - Daniel DiPaolo
4
@Daniel:那不是问题所在。问题是:在C++中,~的含义是什么?而提问者只在一个上下文中看到过它的使用,我向他展示了另一个上下文,在那里相同的符号具有完全不同的含义! - Nawaz
6
@Nawaz,这不是倾倒随意相关信息的地方,答案应该回答被问到的问题,你的回答没有回答问题-无论你在解释中提出任何警告。 - Daniel DiPaolo
11
很重要的一点是,这个答案出现在这个页面上,否则提问者可能会以为波浪号只用作析构函数的名称而离开。但这并不正确。(尽管为了使它成为一个真正好的答案,你还应该谈到析构函数。) - Lightness Races in Orbit
4
我来自搜索引擎,查找我正在检查的C ++代码中波浪符的含义。在我的情况下,它是位运算符。这里有两个答案都很有帮助。 - BryKKan
显示剩余11条评论

7

~符号表示它是一个析构函数,当对象超出范围时,相应的析构函数就会被调用。

什么时候调用析构函数?

举个例子 -

#include <iostream> 
class foo
{
    public:
    void checkDestructorCall() ;
    ~foo();
};

void foo::checkDestructorCall()
{
    foo objOne;   // objOne goes out of scope because of being a locally created object upon return of checkDestructorCall
}

foo:: ~foo()
{
    std::cout << "Destructor called \t" << this << "\n";
}

int main()
{
    foo obj;    // obj goes of scope upon return of main
    obj.checkDestructorCall();
    return 0;
}

我的系统上的结果:

Destructor called   0xbfec7942  
Destructor called   0xbfec7943

这个例子只是用来说明析构函数何时被调用。但是只有当类管理资源时才会编写析构函数。

什么是类管理资源?

#include <iostream> 
class foo
{

    int *ptr;

    public:
    foo() ; // Constructor
    ~foo() ;

};

foo:: foo()
{
     ptr = new int ; // ptr is managing resources.
                     // This assignment can be modified to take place in initializer lists too.
}

foo:: ~foo()
{
    std::cout << "Destructor called \t" << this << "\n";
    delete ptr ; // Returning back the resources acquired from the free store.
                 // If this isn't done, program gives memory leaks.
}

int main()
{
    foo *obj = new foo;
    // obj is pointing to resources acquired from free store. Or the object it is pointing to lies on heap. So, we need to explicitly call delete on the pointer object.

    delete obj ;  // Calls the ~foo
    return 0;
}

我的系统上的结果:

Destructor called   0x9b68008

在您发布的程序中,我认为不需要编写析构函数。希望这有所帮助!


4
这是类析构函数。如果您想了解面向对象编程中的基础概念,建议您学习C++开发入门教材。这里有一个好的参考网站(链接),另外C++ FAQ也是一个不错的资源。(链接)

4
最好的做法是查看《C++书籍指南和列表》(Definitive C++ Book Guide and List)。链接为:https://dev59.com/_3RC5IYBdhLWcg3wK9yV。 - Fred Larson

2

~AirlineTicket(); 是类 AirlineTicket 的析构函数。

请参考此链接以了解更多信息。

当您删除该类的对象时,析构函数将被调用,以释放由对象分配的任何内存或正在使用的资源。


1

~引入了一个析构函数。它的使用是因为(a)它是可用的,以及(b)~是“不”的数学符号之一。



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接