C++构造与析构(11) - 析构函数的行为
来源:互联网 发布:莫达非尼淘宝 编辑:程序博客网 时间:2024/06/03 20:45
参考下面的这个例子。
#include <iostream>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之前,就已经获取到了i的当前值3,因此输出为i = 3.
当从一个函数返回时,析构函数属于一个最后才被执行的方法。 当i值已经拷贝给函数的返回值(return value)之后,ob的析构函数才会被调用。因此,在析构函数将i值修改为10之前,就已经获取到了i的当前值3,因此输出为i = 3.
如何使得程序可以输出“i = 10"?
可以使用下面的几种方法:
1) 返回引用
2. 在块作用域内创建对象
#include <iostream>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 <iostream>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;}
0 0
- C++构造与析构(11) - 析构函数的行为
- c++-构造函数与析构函数
- C++--构造函数与析构函数
- 【c++】构造函数与析构函数
- C++:构造函数与析构函数
- C语言的构造函数与析构函数
- c++:构造函数(constructor)和析构函数(destructor)中编译器的隐式行为(implicit behavior)
- 【C++】初始化与清除(构造函数与析构函数)
- 【零起点学通C++】构造函数与默认构造函数的代码及析构函数的相关笔记
- srting的类构造函数、析构函数、拷贝构造函数与赋值构造函数
- [C++]构造函数与析构函数讲解
- 构造函数与析构函数(C++)
- C++_构造函数与析构函数
- 初识C#——构造函数与析构函数
- 关于Object-c 中的构造函数与析构函数
- C++(构造函数与析构函数)
- C/C++面试题:构造函数与析构函数
- 3.4构造函数与析构函数【C++】
- 自定义jQuery插件(一)
- PHP 垃圾回收机制
- android网络编程
- 32位和64位下结构体内存对齐问题
- 解决找不到ifconfig命令,更改路径并重启系统后进入命令行界面以及各个命令无法执行Linux:-bash: ***: command not found
- C++构造与析构(11) - 析构函数的行为
- 关于XSS(跨站脚本攻击)和CSRF(跨站请求伪造)
- web.xml里<filter-mapping>中的<dispatcher>作用
- UVA - 11504 Dominos 强连通分量
- win7 能ping通dns, 但无法解析域名
- 解析 Nginx 负载均衡
- 【金蝶KIS零售版V4.2】汉码盘点机无缝对接金蝶盘点机PDA条码数据采集器
- 给程序员的五点建议 如何成为编程高手并以此创业
- Android Studio启动时联网,但google被墙,僵死