Playing with Destructors in C++
Predict the output of the below code snippet.
1 #include <iostream>
2 using namespace std;
3
4 int i;
5
6 class A
7 {
8 public:
9 ~A()
10 {
11 i=10;
12 }
13 };
14
15 int foo()
16 {
17 i=3;
18 A ob;
19 return i;
20 }
21
22 int main()
23 {
24 cout << "i = " << foo() << endl;
25 return 0;
26 }
  Output of the above program is “i = 3″.
  Why the output is i= 3 and not 10? 
  While returning from a function, destructor is the last method to be executed. The destructor for the object “ob” is called after the value of i is copied to the return value of the function. So, before destructor could change the value of i to 10, the current value of i gets copied & hence the output is i = 3.
  How to make the program to output “i = 10″ ? 
  Following are two ways of returning updated value:
  1) Return by Reference:
  Since reference gives the l-value of the variable,by using return by reference the program will output “i = 10″.
1 #include <iostream>
2 using namespace std;
3
4 int i;
5
6 class A
7 {
8 public:
9 ~A()
10 {
11 i = 10;
12 }
13 };
14
15 int& foo()
16 {
17 i = 3;
18 A ob;
19 return i;
20 }
21
22 int main()
23 {
24 cout << "i = " << foo() << endl;
25 return 0;
26 }
The function foo() returns the l-value of the variable i. So, the address of i will be copied in the return value.
Since, the references are automatically dereferened. It will output “i = 10″.
2) Create the object ob in a block scope
1 #include <iostream>
2 using namespace std;
3
4 int i;
5
6 class A
7 {
8 public:
9 ~A()
10 {
11 i = 10;
12 }
13 };
14
15 int foo()
16 {
17 i = 3;
18 {
19 A ob;
20 }
21 return i;
22 }
23
24 int main()
25 {
26 cout << "i = " << foo() << endl;
27 return 0;
28 }
Since the object ob is created in the block scope, the destructor of the object will be called after the block ends, thereby changing the value of i to 10. Finally 10 will copied to the return value.
This article is compiled by Aashish Barnwal and reviewed by GeeksforGeeks team.
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
转载请注明:http://www.cnblogs.com/iloveyouforever/
2013-11-26 11:06:08
Playing with Destructors in C++的更多相关文章
- (转) Playing FPS games with deep reinforcement learning
		
Playing FPS games with deep reinforcement learning 博文转自:https://blog.acolyer.org/2016/11/23/playing- ...
 - (转) Deep Reinforcement Learning: Playing a Racing Game
		
Byte Tank Posts Archive Deep Reinforcement Learning: Playing a Racing Game OCT 6TH, 2016 Agent playi ...
 - Codeforces Round #184 (Div. 2) E. Playing with String(博弈)
		
题目大意 两个人轮流在一个字符串上删掉一个字符,没有字符可删的人输掉游戏 删字符的规则如下: 1. 每次从一个字符串中选取一个字符,它是一个长度至少为 3 的奇回文串的中心 2. 删掉该字符,同时,他 ...
 - ifrog-1028 Bob and Alice are playing numbers(trie树)
		
题目链接: Bob and Alice are playing numbers DESCRIPTION Bob and his girl friend are playing game togethe ...
 - 论文笔记之:Playing for Data: Ground Truth from Computer Games
		
Playing for Data: Ground Truth from Computer Games ECCV 2016 Project Page:http://download.visinf.tu- ...
 - 论文笔记之:Playing Atari with Deep Reinforcement Learning
		
Playing Atari with Deep Reinforcement Learning <Computer Science>, 2013 Abstract: 本文提出了一种深度学习方 ...
 - (C++) Interview in English. -  Constructors/Destructors
		
Constructors/Destructors. 我们都知道,在C++中建立一个类,这个类中肯定会包括构造函数.析构函数.复制构造函数和重载赋值操作:即使在你没有明确定义的情况下,编译器也会给你生成 ...
 - CodeForces 176C Playing with Superglue 博弈论
		
Playing with Superglue 题目连接: http://codeforces.com/problemset/problem/176/C Description Two players ...
 - Playing with ptrace, Part II
		
Playing with ptrace, Part II Issue From Issue # December Dec , By Pradeep Padala inSysAdmin In Part ...
 
随机推荐
- 为什么Hashtab的大小通常取远离2^n 的素数
			
举个栗子 在Hashtab中我们通常 Hash(key) % M 来确定 key 所需要存放的位置 M就是Hashtab的大小,假设下面的两个场景 Hash(key1) = 108 Hash(key2 ...
 - 问题 Q: 最大的数
			
题目描述 小明和小红在打赌说自己数学学的好,于是小花就给他们出题了,考考他们谁NB,题目是这样的给你N个数 在这n个数之间添加N-1个*或+,使结果最大,但不可以打乱原顺序,请得出这个结果 如 1 3 ...
 - 【linux系统】命令学习(一)ssh
			
ssh 1.在终端执行命令 ssh -p22 username@host 2.密码输入是看不到内容的 3.登入成功后默认进入的是home目录,就是根目录下的home目录 4.[root@VM-4-1 ...
 - 解决异常:“The last packet sent successfully to the server was 0 milliseconds ago. ”的办法
			
出现异常"The last packet sent successfully to the server was 0 milliseconds ago."的大部分原因是由于数据库回 ...
 - 【BugFix】K8S节点NOT READY状态,错误信息:network plugin is not ready: cni config uninitialized
			
错误现象 runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: netw ...
 - [cf1515I]Phoenix and Diamonds
			
将$n$类物品按照价值为第一关键字(从大到小).质量为第二关键字(从小到大)排序,此时贪心策略即依次贪心选(排序后)第$i$类的物品(其中$i$从1到$n$) 为了方便,排序后第$i$类物品质量.价值 ...
 - [loj574]黄金矿工
			
记$dep_{x}$为1到$x$的边权和,当$x$上的矿工挖了$y$上的黄金时($y$在$x$子树内),显然$\sum_{e}c_{e}=dep_{y}-dep_{x}$ 由此,对于$u$上权值为$v ...
 - [loj3175]排列鞋子
			
贪心与最近的鞋子匹配(大小相同且方向相反),记$a_{x}$表示第x双鞋子的左位置,$b_{x}$表示右位置 若$a_{x}>b_{x}$,那么可以交换这两双鞋子并令答案+1,所以不妨设$a_{ ...
 - idea插件  Background Image Plus 随机更换背景图片
			
首先在市场搜索: Background Image Plus 设置图片: 在view中,有set 图片,有random图片,有clean图片的 设置就是用set,随便设置个路径. 重点来了,随机更换背 ...
 - UOJ 266 - 【清华集训2016】Alice和Bob又在玩游戏(SG 定理+01-trie)
			
题面传送门 神仙题. 首先注意到此题的游戏是一个 ICG,故考虑使用 SG 定理解决这个题,显然我们只需对每个连通块计算一遍其 SG 值异或起来检验是否非零即可.注意到我们每删除一个点到根节点的路径后 ...