大家帮忙分析一个小程序, 输出结果感觉有问题!
程序如下, 其中类Obj_trace的作用在于跟踪, 类Array的作用
相当于容器, 里面存放的是Obj_trace对象。
#include <iostream>
using namespace std;
class Obj_trace
{
public:
Obj_trace():sz(++count)
{
cout < < "Object " < <sz < < " constructed " < <endl;
}
~Obj_trace()
{
cout < < "Object " < <sz < < " destroyed " < <endl;
}
Obj_trace(const Obj_trace& rhs):sz(++count)
{
cout < < "Object " < <sz < < " constructed " < <endl;
}
Obj_trace& operator=(const Obj_trace& rhs)
{
return *this;
}
private:
static int count;
int sz;
};
int Obj_trace::count = 0;
template <class T>
class Array
{
public:
Array(int n=0):data(new T[n]), sz(n){}
~Array()
{
delete[] data;
}
Array(const Array& rhs)
{
Init(rhs.data, rhs.sz);
}
Array& operator=(const Array& rhs)
{
if (&rhs != this)
{
delete[] data;
Init(rhs.data, rhs.sz);
}
return *this;
}
private:
T* data;
int sz;
void Init(T* p, int n)
{
data = new T[n];
sz = n;
//for (int i=0; i <n; i++)
//data[i] = p[i];
}
};
int main()
{
Array <Obj_trace> x(3);
Array <Obj_trace> y = x;
x = y;
return 0;
}
调试环境: Visual C++6.0。
输出结果为:
Object 1 constructed
Object 2 constructed
Object 3 constructed
Object 4 constructed
Object 5 constructed
Object 6 constructed
Object 3 destroyed
Object 2 destroyed
Object 1 destroyed
Object 7 constructed
Object 8 constructed
Object 9 constructed
Object 6 destroyed
Object 5 destroyed
Object 4 destroyed
Object 9 destroyed
Object 8 destroyed
Object 7 destroyed
我个人理解的输出结果应该如下,也就是对象4,5,6应该在7,8,9之后销毁,
因为对象4,5,6比7,8,9先创建。可实际结果却是4,5,6先销毁,请大虾指点!
Object 1 constructed
Object 2 constructed
Object 3 constructed
Object 4 constructed
Object 5 constructed
Object 6 constructed
Object 3 destroyed
Object 2 destroyed
Object 1 destroyed
Object 7 constructed
Object 8 constructed
Object 9 constructed
Object 9 destroyed
Object 8 destroyed
Object 7 destroyed
Object 6 destroyed
Object 5 destroyed
Object 4 destroyed
[解决办法]
抱歉,搞错了
------解决方案--------------------
就是一种嵌套关系,可以理解为构造函数和析构函数入栈出栈的顺序。