ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-10-20 19:02:11  阅读:208  来源: 互联网

标签:析构 string grade 函数 C++ Student 构造函数


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

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

 

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

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

 

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

 

什么叫摧毁?

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

 

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

以上一章的 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 };

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

 

标签:析构,string,grade,函数,C++,Student,构造函数
来源: https://www.cnblogs.com/tweechalice/p/11708579.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有