预测以下代码段的输出。
#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等的更多准备工作,请参阅“完整面试准备课程” 。