关于调用构造函数
class CLS
{
public:
int m_i;
CLS( int i )
{
this->m_i=i;
}
CLS()
{
CLS(0);
}
};
void main()
{
CLS obj;
cout << obj.m_i << endl;
}
解析一下为什么不能输出0呢?我单步调式过,this->m_i=i;是能执行的,m_i也能赋值为0,但是CLS( int i ) 一返回的时候,m_i的值就改变了,这是为什么呢?
[解决办法]
原因:
上面代码中,CLS obj;这里已经为obj分配了内存,然后调用默认构造函数,但是默认构造函数还未执行完,却调用了另一个构造函数,这样相当于产生了一个匿名的临时CLS对象,它调用CLS(int)构造函数,将这个匿名临时对象自己的数据成员m_i初始化为0;但是obj的数据成员并没有得到初始化。于是obj的m_i是未初始化的,因此其值也是不确定的。
改成这样(用placement new)就行了:
#include <iostream>using namespace std;class CLS{public: int m_i; //CLS(int i) //{ // this->m_i = i; //} //CLS() //{ // CLS(0); //} CLS( int i ) : m_i(i){} CLS() { new (this)CLS(0); }};void main(){ CLS obj; cout << obj.m_i << endl;}