了解C++析构函数:何时调用
在面向对象的编程中,需要关注对象的创建和销毁。C++中,创建对象已经被广泛讨论,但是析构函数对于一个对象的生命周期同样重要。本文将深入探讨C++中的析构函数以及何时调用。
什么是析构函数
在C++中,每个类都可以定义只能由系统自动调用的析构函数。可以通过定义析构函数来实现对象在销毁时所需要完成的一些动作,例如释放动态分配的内存等。
一个析构函数的命名规则如下:
~class_name () {
//动作
}
例如,以下是一个构造函数和析构函数的例子:
```cpp
#include
using namespace std;
class Example {
public:
Example(){
cout << \"Constructor called.\" << endl;
}
~Example(){
cout << \"Destructor called.\" << endl;
}
};
int main() {
Example obj;
return 0;
}
```
输出结果为
```
Constructor called.
Destructor called.
```
可以看到,析构函数在对象销毁时自动调用。
何时调用析构函数
在C++中,析构函数的调用有以下三种情况:
1. 正常作用域结束
当一个对象在其作用域结束时(比如函数结束),析构函数会被自动调用。以下是一个例子:
```cpp
#include
using namespace std;
class Example {
public:
Example(){
cout << \"Constructor called.\" << endl;
}
~Example(){
cout << \"Destructor called.\" << endl;
}
};
void func(){
Example obj;
}
int main() {
cout << \"Before func().\" << endl;
func();
cout << \"After func().\" << endl;
return 0;
}
```
输出结果为:
```
Before func().
Constructor called.
Destructor called.
After func().
```
可以看到,当func()函数结束时,Example对象的析构函数被调用。
2. 对象被销毁
当对象被销毁时,析构函数会被自动调用。以下是一个例子:
```cpp
#include
using namespace std;
class Example {
public:
Example(){
cout << \"Constructor called.\" << endl;
}
~Example(){
cout << \"Destructor called.\" << endl;
}
};
int main() {
Example *ptr = new Example();
delete ptr;
return 0;
}
```
输出结果为:
```
Constructor called.
Destructor called.
```
可以看到,当Example对象被delete时,析构函数被调用。
3. 异常抛出
当异常在对象的构造函数中抛出时,对象的析构函数会被自动调用来销毁对象。
例如:
```cpp
#include
using namespace std;
class Example {
public:
Example(){
cout << \"Constructor called.\" << endl;
throw \"Exception thrown in constructor.\";
}
~Example(){
cout << \"Destructor called.\" << endl;
}
};
int main() {
try {
Example obj;
}
catch(...) {
cout << \"Exception caught.\" << endl;
}
return 0;
}
```
输出结果为:
```
Constructor called.
Destructor called.
Exception caught.
```
可以看到,当Example对象的构造函数抛出异常时,析构函数被调用来销毁对象。
总结
在C++中,析构函数在对象销毁时自动调用。一个类的析构函数定义和命名规则是固定的,可以通过定义析构函数来实现对象在销毁时所需要完成的动作。以上通过实际例子详细说明了何时会调用析构函数,让读者更好地了解C++中的析构函数。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至3237157959@qq.com 举报,一经查实,本站将立刻删除。