析构函数与变量的生存周期
2018-06-17 22:27:14来源:未知 阅读 ()
这篇介绍了析构函数,是我的读书笔记,我希望它够简短但又比较全面,起到复习的作用。如果有一些C++知识记不清楚了,它可以帮你很快回忆起来。
析构函数(destructor)的名字与类名相同,但是前面要加“~”。析构函数没有参数和返回值,当然也就不能被重载。
何时调用析构函数
析构函数在对象消亡时自动调用,这是都了解的情况,但是实际上这还隐含的说:函数的参数对象以及作为函数返回值的对象,在消亡时也会引发析构函数调用。
1 #include<iostream> 2 using namespace std; 3 class CNum { 4 public: 5 int num; 6 ~CNum() { cout << "destructor" << endl; } 7 CNum() { num = 0; cout << "constractor CNum()" << endl; } 8 CNum(CNum & n) { num = n.num; cout << "constractor CNum(CNum & n)" << endl; } 9 }; 10 11 CNum fun(CNum n) { 12 cout << "fun()start" << endl; 13 n.num = 3; //这里的修改只是对形参的修改,对实参没影响 14 return n; 15 } 16 17 int main() { 18 CNum n1; 19 n1 = fun(n1); 20 return 0; 21 }
运行结果:
constractor CNum()
constractor CNum(CNum & n) //构造形参n
fun()
constractor CNum(CNum & n) //构造作为返回值的临时对象
destructor //fun的返回值是一个临时对象,临时对象的生存周期只有一条语句
destructor //离开fun(),形参n消亡
destructor //main结束时局部变量n1消亡
请按任意键继续. . .
调用函数时使用传引用而不是直接传递对象,可以省掉很多次不必要的函数调用,特别是这个函数会被频繁调用的时候。
虚析构函数
析构函数可以是虚函数,但是构造函数不能。(想一想构造函数可以重载,但析构函数不能,这对冤家也算扯平了吧╮(╯▽╰)╭)
一般来说,一个类如果定义了虚函数,则最好将析构函数也定义成虚函数。之所以有这样的建议,因为这里容易出现隐蔽的bug。看一段代码:
1 class CShape { 2 public: ~CShape() {/*什么也不做*/} 3 }; 4 5 class CCircle :public CShape { 6 public: 7 CCircle() {/*这里分配了内存*/} 8 ~CCircle() {/*这里释放了内存*/ } 9 }; 10 11 int main() { 12 CShape * ptrShape = new CCircle(); 13 delete ptrShape; 14 return 0; 15 }
那么, delete ptrShape; 执行时是执行了哪一个析构函数呢?恰恰不是我们希望调用的 ~CCircle(),而是调用了什么都不做的~CShape(),内存泄露了。为了避免发生这种事一般采取的办法就是把析构函数定义成虚函数。也就是 virtual ~CShape(){/*什么都不做*/}; 。只要基类的析构函数是虚函数,那么派生类的析构函数不论是否用“virtule”关键字声明,都会成为虚析构函数。
变量的生存期
1)全部变量的生存周期是从程序开始到最后,而且是先定义的先产生,后消亡。全局变量的构造函数在进入main()之前就已经调用,在推出main()之后才消亡。
2)临时对象的生存周期不会大于语句的执行时间。类型转换语句和返回语句等可能会产生临时变量。
3)局部变量的生存期是从定义开始到最近的“}”结束
4)静态局部变量在第一次执行定义语句时构造产生,在程序的结尾全局变量消亡前消亡。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- C++ 转换函数搭配友元函数 2020-06-10
- C++ rand函数 2020-06-10
- C++ 友元函数 2020-06-10
- C++ const成员函数 2020-06-03
- C++ 析构函数 2020-06-03
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash