📜  在C++中玩析构函数

📅  最后修改于: 2021-05-26 01:22:21             🧑  作者: Mango

预测以下代码段的输出。

#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”。
为什么输出为i = 3而不是10?
从函数返回时,析构函数是要执行的最后一个方法。在将i的值复制到函数的返回值之后,将调用对象“ ob”的析构函数。因此,在析构函数可以将i的值更改为10之前,将复制i的当前值,因此输出为i = 3。

如何使程序输出“ i = 10”?
以下是两种返回更新值的方法:

1)参考归还:
由于引用给出了变量的l值,因此通过使用引用返回,程序将输出“ i = 10”。

#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;
}

函数foo()返回变量i的l值。因此,i的地址将被复制到返回值中。从此以后,引用将自动取消引用。它将输出“ i = 10”。

2.在块范围内创建对象ob

#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是在块范围内创建的,因此对象的析构函数将在块结束后被调用,从而将i的值更改为10。最后将10复制到返回值。

要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”