读书人

关于调用构造函数解决办法

发布时间: 2012-07-15 20:20:06 作者: rapoo

关于调用构造函数
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)就行了:

C/C++ code
#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;} 

读书人网 >C++

热点推荐