服务器之家

服务器之家 > 正文

C++ 析构函数与变量的生存周期实例详解

时间:2021-05-18 15:05     来源/作者:painterQ

 C++ 析构函数与变量的生存周期实例详解

这篇介绍了析构函数,是我的读书笔记,我希望它够简短但又比较全面,起到复习的作用。如果有一些C++知识记不清楚了,它可以帮你很快回忆起来。

析构函数(destructor)的名字与类名相同,但是前面要加“~”。析构函数没有参数和返回值,当然也就不能被重载。

何时调用析构函数

析构函数在对象消亡时自动调用,这是都了解的情况,但是实际上这还隐含的说:函数的参数对象以及作为函数返回值的对象,在消亡时也会引发析构函数调用。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<iostream>
using namespace std;
class CNum {
public:
  int num;
  ~CNum() { cout << "destructor" << endl; }
  CNum() { num = 0; cout << "constractor CNum()" << endl; }
  CNum(CNum & n) { num = n.num; cout << "constractor CNum(CNum & n)" << endl; }
};
 
CNum fun(CNum n) {
  cout << "fun()start" << endl;
  n.num = 3;                //这里的修改只是对形参的修改,对实参没影响
  return n;
}
 
int main() {
  CNum n1;
  n1 = fun(n1);
  return 0;
}

运行结果:

constractor CNum()
constractor CNum(CNum & n)  //构造形参n
fun()      
constractor CNum(CNum & n)  //构造作为返回值的临时对象
destructor            //fun的返回值是一个临时对象,临时对象的生存周期只有一条语句
destructor            //离开fun(),形参n消亡
destructor            //main结束时局部变量n1消亡

请按任意键继续. . .

调用函数时使用传引用而不是直接传递对象,可以省掉很多次不必要的函数调用,特别是这个函数会被频繁调用的时候。

虚析构函数

析构函数可以是虚函数,但是构造函数不能。(想一想构造函数可以重载,但析构函数不能,这对冤家也算扯平了吧╮(╯▽╰)╭)

一般来说,一个类如果定义了虚函数,则最好将析构函数也定义成虚函数。之所以有这样的建议,因为这里容易出现隐蔽的bug。看一段代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class CShape {
public: ~CShape() {/*什么也不做*/}
};
 
class CCircle :public CShape {
  public:
  CCircle() {/*这里分配了内存*/}
  ~CCircle() {/*这里释放了内存*/ }
};
 
int main() {
  CShape * ptrShape = new CCircle();
  delete ptrShape;
  return 0;
}

那么,  delete ptrShape; 执行时是执行了哪一个析构函数呢?恰恰不是我们希望调用的 ~CCircle(),而是调用了什么都不做的~CShape(),内存泄露了。为了避免发生这种事一般采取的办法就是把析构函数定义成虚函数。也就是 virtual ~CShape(){/*什么都不做*/}; 。只要基类的析构函数是虚函数,那么派生类的析构函数不论是否用“virtule”关键字声明,都会成为虚析构函数。

变量的生存期

1)全部变量的生存周期是从程序开始到最后,而且是先定义的先产生,后消亡。全局变量的构造函数在进入main()之前就已经调用,在推出main()之后才消亡。

2)临时对象的生存周期不会大于语句的执行时间。类型转换语句和返回语句等可能会产生临时变量。

3)局部变量的生存期是从定义开始到最近的“}”结束

4)静态局部变量在第一次执行定义语句时构造产生,在程序的结尾全局变量消亡前消亡。

 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

热门资讯

2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
2021德云社封箱演出完整版 2021年德云社封箱演出在线看
2021德云社封箱演出完整版 2021年德云社封箱演出在线看 2021-03-15
返回顶部