从早期的精彩帖子(例如What are the differences between a pointer variable and a reference variable in C++?)中,我了解到引用可以延长临时对象的寿命。所以,我决定自己尝试一下并获得一个非常意外的(对我而言)结果。这是代码:
#include <iostream>
using namespace std;
class B {
public:
B() {cout << "Constructor of B" << endl;}
~B() {cout << "Destructor of B" << endl;}
void methodB(){cout << "B is alive!" << endl;}
};
class A {
public:
A() {cout << "Constructor of A" << endl;}
~A() {cout << "Destructor of A" << endl;}
B &methodA() {
cout << "Entering methodA()" << endl;
B b;
B &a = b;
cout << "Exiting methodA()" << endl;
return a;
}
};
int main() {
A a;
B &b = a.methodA();
cout << "After the call to methodA()" << endl;
b.methodB();
return 0;
}
我希望在main()完成时销毁B类的对象。但是,这是我得到的输出:
Constructor of A
Entering methodA()
Constructor of B
Exiting methodA()
Destructor of B
After the call to methodA()
B is alive!
Destructor of A
注意在执行B的析构函数之后如何执行对methodB()的调用。这种行为有什么解释?
答案 0 :(得分:1)
我了解到引用可以延长临时对象的使用寿命
代码中没有对临时对象的引用。返回对从A::methodA()
返回后销毁的局部变量的引用。 &#34; B还活着!&#34;打印只是因为您没有在B
中引用任何B::methodB()
成员变量。这是无效的,但它可能(或可能不)起作用。
调用b.methodB()
基本上是调用一个隐式隐藏的第一个类型B* const
和值&b
的函数。在你的情况下,b
对象已经被销毁(你看到了析构函数被执行),&b
指向堆栈上存放对象时的一些内存,但是因为你没有引用任何B
的成员,这个指针永远不会被解除引用,这是有效的(尽管你不应该依赖于此)。