C++ 对象构造与析构以及内存布局(一)

2014-11-24 03:33:27 · 作者: · 浏览: 0
主要探讨对象的构造顺序与内存的布局,主要参考来源为《Exceptional C++ Style中文版》
文中第十四条 顺序!顺序!根据文中的代码摘录如下,代码中添加了一些调试的信息。
[cpp]
#include
struct classcomp {
bool operator() (const __int64& lhs, const __int64& rhs) const
{return lhs
};
std::multimap<__int64,std::string,classcomp> m_Construtor;
class B1{
public:
B1()
{
std::cout<<"Constructor B1 "<
m_Construtor.insert(std::pair<__int64,std::string>((__int64)this,"Constructor B1 "));
}
virtual ~B1()
{
std::cout<<"Destructor B1 "<
}
};
class V1:public B1{
public:
V1()
{
std::cout<<"Constructor V1 "<
m_Construtor.insert(std::pair<__int64,std::string>((__int64)this,"Constructor V1 "));
}
virtual ~V1()
{
std::cout<<"Destructor V1 "<
}
};
class D1:virtual public V1{
public:
D1()
{
std::cout<<"Constructor D1 "<
m_Construtor.insert(std::pair<__int64,std::string>((__int64)this,"Constructor D1 "));
}
virtual ~D1()
{
std::cout<<"Destructor D1 "<
}
};
class B2{
public:
B2()
{
std::cout<<"Constructor B2 "<
m_Construtor.insert(std::pair<__int64,std::string>((__int64)this,"Constructor B2 "));
}
virtual ~B2()
{
std::cout<<"Destructor B2 "<
}
};
class B3{
public:
B3()
{
std::cout<<"Constructor B3 "<
m_Construtor.insert(std::pair<__int64,std::string>((__int64)this,"Constructor B3 "));
}
virtual ~B3()
{
std::cout<<"Destructor B3 "<
}
};
class V2:public B1,public B2{
public:
V2()
{
std::cout<<"Constructor V2 "<
m_Construtor.insert(std::pair<__int64,std::string>((__int64)this,"Constructor V2 "));
}
virtual ~V2()
{
std::cout<<"Destructor V2 "<
}
};
class D2:public B3,virtual public V2{
public:
D2()
{
std::cout<<"Constructor D2 "<
m_Construtor.insert(std::pair<__int64,std::string>((__int64)this,"Constructor D2 "));
}
virtual ~D2()
{
std::cout<<"Destructor D2 "<
}
};
class M1{
public:
M1()
{
std::cout<<"Constructor M1 "<
m_Construtor.insert(std::pair<__int64,std::string>((__int64)this,"Constructor M1 "));
}
virtual ~M1()
{
std::cout<<"Destructor M1 "<
}
};
class M2{
public:
M2()
{
std::cout<<"Constructor M2 "<
m_Construtor.insert(std::pair<__int64,std::string>((__int64)this,"Constructor M2 "));
}
virtual ~M2()
{
std::cout<<"Destructor M2 "<
}
};
class X:public D1,public D2
{
public:
X()
{
std::cout<<"Constructor X "<
m_Construtor.insert(std::pair<__int64,std::string>((__int64)this,"Constructor X "));
}
virtual ~X()
{
std::cout<<"Destructor X "<
}
private:
M1 _m1;
M2 _m2;
};
int _tmain(int argc, _TCHAR* argv[])
{
//B b;
int i;
X *pX = new X;
std::cout<<"--------------------------------------------"<<'\n';
cout.setf(ios::showbase | ios::uppercase); //设置基指示符输出和数值中的字母大写输出
std::multimap<__int64,std::string,classcomp> ::iterator iter;
for (iter = m_Construtor.begin();iter != m_Construtor.end();++iter)//遍历
{
cout<
}
std::cout<<"--------------------------------------------"<<'\n';
delete pX;
pX = NULL;
std::cin>>i;
return 0;
}
以上程序的运行结果为:
Constructor B1 005F7F94
Constructor V1 005F7F94
Constructor B1 005F7F98
Constructor B2 005F7F9C
Constructor V2 005F7F98
Constructor D1 005F7F88
Constructor B3 005F7F80
Constructor D2 005F7F80
Constructor M1 005F7F8C
Constructor M2 005F7F90
Constructor X 005F7F80
--------------------------------------------
0X5F7F80 Constr