码迷,mamicode.com
首页 > 编程语言 > 详细

C++ 类的析构函数 (~)

时间:2019-10-20 20:15:54      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:code   namespace   hal   作用   something   需要   out   其它   ret   

上一章中, 我们已详细地讲解了类的构造函数, 如果对类还不熟悉的话看这里

如果发现本章内容不适合你, 可以看这里

在本章中, 类的初步基础已有一些了, 继续深入

 

在类中, 有了构造函数, 不知有没有想过, 与构造函数相反的功能?

构造函数开辟空间, 赋值变量, 有没有释放空间, 还原变量的呢?----当然有

 

重点介绍析构函数 (与构造函数相反), 构造函数在变量一创建就调用, 而析构函数在变量被摧毁时调用

 

什么叫摧毁?

即为变量的作用域已超出, 程序终止时该变量就被摧毁

 

好了, 那么析构函数如何编写, 只是举一反三罢了

以上一章的 Student 类做例子:

 

 1 #include <string>
 2 using std::string;
 3 class Student
 4 {
 5 private:
 6     string n;
 7     int grade;
 8 public:
 9     Student(string name,int g): n(name),grade(g) {}
10     ~Student();
11 };

 

第10行的即为析构函数

极不推荐的当前的格式 (推荐的请见下文):

~<DataType>(<List>)


<DataType>
为该类的名字

<List> 为参数列表

 

析构函数就只有一种写法, 这是不同于构造函数既可以写在外面, 又可以写在里面

很简单的例子, 就可以证明该变量的构造与析构函数的调用的时候:

 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4 class Student
 5 {
 6 private:
 7     string n;
 8     int grade;
 9 public:
10     Student()
11     {
12         cout<<"Create!!!\n";
13     }
14     ~Student()
15     {
16         cout<<"Destroy!!!\n";
17     }
18 };
19 int main()
20 {
21     Student s;
22     cout<<"Continue..."<<endl;
23     return 0;
24 }

输出:

Create!!!
Continue...
Destroy!!!

 

当然, 析构函数也可以写在类的外部, 与构造函数等相同:

Student::~Student()
{
    //Do something...
}

 

但是, 在复杂的类中,析构函数没有成功调用的话, 可能内存空间没有被释放 (内存泄漏),

也许很多人会疑惑, 这不是变量摧毁是就会调用吗? 怎么会没有调用呢?

 

这是一个比较复杂的话题, 先提前给出答案: 继承

C++ 中的继承一直是一个很复杂的东西, 请等待有关继承的内容

这种复杂的类的关系, 导致有的时候无法正确调用析构函数

 

我们只需要将析构函数的格式变更一下即可:

virtual ~<DataType>(<List>)

 

这是最终的也是最完美的写法, 以后析构函数必须这样写

 

class Student
{
private:
    string n;
    int grade;
public:
    Student()=default;
    virtual ~Student();
};
Student::~Student()
{
    cout<<"Destroy!!!\n";
}

 

等价于:

class Student
{
private:
    string n;
    int grade;
public:
    Student()=default;
    virtual ~Student()//也可以在类的内部直接实现
    {
        cout<<"Destroy!!!\n";
    }
};

 

 

当然, 跟构造函数相同, 如果什么都不想写, 也可以直接调用系统默认

1 class Student
2 {
3 private:
4     string n;
5     int grade;
6 public:
7     Student()=default;
8     virtual ~Student()=default;
9 };

就讲到这里了, 请等待更新...

 其它的关于类的部分, 可以看这里

C++ 类的析构函数 (~)

标签:code   namespace   hal   作用   something   需要   out   其它   ret   

原文地址:https://www.cnblogs.com/tweechalice/p/11708579.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!