我有一个A类,它包含另一个B类的对象。这是一个私有对象。但是,当我尝试使用A的对象访问B的成员变量时,不知何故B的析构函数被调用。 无法理解为什么在这里调用B的析构函数?
以下代码的输出为:
In B ctor
In A ctor
10
In B dtor <------ Why this ?
In A dtor
In B dtor
代码示例:
#include "stdafx.h"
#include <iostream>
using namespace std;
//Implementaion of B class
class B
{
public:
int bVal1;
B::B(void)
{
cout << "In B ctor" << endl;
bVal1 = 10;
}
B::~B(void)
{
cout << "In B dtor" << endl;
}
};
//Implementaion of A class having private B's object ( composition )
class A
{
private:
B b;
public:
A::A(void)
{
cout << "In A ctor" << endl;
}
A::~A(void)
{
cout << "In A dtor" << endl;
}
B A::func2(void)
{
return b;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
A a; //ctor calling order : B followed by A
cout << a.func2().bVal1 << endl; //Why ADDITIONAL B's destructor is getting called here ???
return 0; //dtor calling order : A followed by B
}
我为这段长代码道歉。
答案 0 :(得分:3)
你运作
B A::func2(void)
{
return b;
}
返回B
类型的对象的副本。所以你在main()
函数中有一个临时的本地版本。因此,A::b
对象和临时B
对象都被销毁,因此您有2次调用B::~B()
。
你的main()函数等同于:
int _tmain(int argc, _TCHAR* argv[])
{
A a; //ctor calling order : B followed by A
B b = a.func2();
cout << b.bVal1 << endl; //Why ADDITIONAL B's destructor is getting called here ???
return 0; //dtor calling order : b, followed by A::b followed by followed by a
}
尝试这样写:
const B& A::func2(void)
{
return b;
}
这只会给您B::~B()
的一次通话。