zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    分布式配置中心Apollo
    Polling、Long Polling、WebSocket
    Ajax轮询请求
    Spark系列:Python版Spark编程指南
    Python Http请求json解析库
    监听Rabbitmq系统日志(python版)
    mysql主从复制
    SAP FBN1 Number Range In Financial Accounting & Table Name NRIV, OBJ RF_BELEG
    Electronic Bank Statement Upload and Deletion
    SAP EPIC Interpretation Algorithms For Bank Statement Algorithms posting rule auto-calculation 电子银行对账单自动记账 FF_5, FEBAN
  • 原文地址:https://www.cnblogs.com/iloveyouforever/p/3442883.html
Copyright © 2011-2022 走看看