博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++构造与析构(11) - 析构函数的行为
阅读量:4070 次
发布时间:2019-05-25

本文共 1092 字,大约阅读时间需要 3 分钟。

参考下面的这个例子:

#include 
using namespace std;int i; class A{public: ~A() { i=10; }}; int foo(){ i=3; A ob; return i;} int main(){ cout << "i = " << foo() << endl; return 0;}<

上述程序的输出结果:

 i = 3

为何结果是3,而不是10?

当从一个函数返回时,析构函数属于一个最后才被执行的方法。当i值已经拷贝给函数的返回值(return value)之后,ob的析构函数才会被调用。
因此,在析构函数将i值修改为10之前,foo就已经获取到了i的当前值3,因此输出为i = 3。

如何使得程序可以输出i = 10?

可以使用下面的几种方法:

1.返回引用

#include 
using namespace std; int i; class A{public: ~A() { i = 10; }}; int& foo(){ i = 3; A ob; return i;} int main(){ cout << "i = " << foo() << endl; return 0;}

2.在块作用域内创建对象

#include 
using namespace std; int i; class A{public: ~A() { i = 10; }}; int foo(){ i = 3; { A ob; } return i;} int main(){ cout << "i = " << foo() << endl; return 0;}

因为对象ob是在块中创建的,则块作用域结束时,会调用对象ob的析构函数,此时i值会被修改为10。最后做为返回值进行返回。

3.创建动态对象,然后删除之

int foo(){    i = 3;    A *ob = new A();    delete ob;    return i;}

4.创建临时对象

int foo(){    i = 3;    A ob = A();    return i;}

注意:使用此方法,编译时需要带上--no-elide-constructors选项。

转载地址:http://lqeji.baihongyu.com/

你可能感兴趣的文章
js学习二函数
查看>>
js学习三-日期Date
查看>>
js学习五-JSON
查看>>
linux下安装django
查看>>
Python django报错ImportError: cannot import name find_spec
查看>>
js学习六-闭包
查看>>
Django入门
查看>>
宏内核与微内核、Linux内核与Unix内核的区别
查看>>
Django视图模板
查看>>
简述Session 、Cookie、cache 区别
查看>>
CROS实现跨域时授权问题(401错误)的解决
查看>>
Hadoop之基础篇
查看>>
【转】alpha版、beta版、rc版的意思
查看>>
测试方法
查看>>
常见的图片格式及特点
查看>>
Android自定义View仿QQ计步器
查看>>
最简单易懂的设计模式——工厂模式
查看>>
最简单易懂的设计模式——建造者模式
查看>>
Android 解决TextView设置文本和富文本SpannableString自动换行留空白问题
查看>>
最完整的Java IO流学习总结
查看>>