标签: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 };
就讲到这里了, 请等待更新...
其它的关于类的部分, 可以看这里
标签:code namespace hal 作用 something 需要 out 其它 ret
原文地址:https://www.cnblogs.com/tweechalice/p/11708579.html