首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2012-07-15 
关于调用构造函数class CLS{public:int m_iCLS( int i ){this-m_ii}CLS(){CLS(0)}}void main(){CLS

关于调用构造函数
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;} 

热点排行