如此构造~

摘自网上BLOG
原文URL:
http://www.cnblogs.com/chio/archive/2007/10/20/931043.html
http://blog.csdn.net/leatinfy/archive/2008/03/17/2192409.aspx
http://www.cppblog.com/Leon916/archive/2008/10/06/63320.aspx

代码:

#include <iostream>
using namespace std;

class  CLS
{
public:
    
int m_i;
    CLS( 
int i ) //: m_i(i) {}
    {
        m_i 
= i;
    }

    CLS()
    
{
        CLS(
0);
    }

}
;
int  main()
{
    CLS obj;
    cout 
<< obj.m_i << endl;
    return 0;
}

我以为输出会是 0
No,  在 winxp + vc 和 RedHat + G++  环境下

输出的值都为一个 未初始化的值

修改代码如下
#include <iostream>
using namespace std;

class  CLS
{
public:
    
int m_i;
    CLS( 
int i ) //: m_i(i) {}
    {
        m_i 
= i;
        cout 
<< "this - " << (int)this << endl;
    }

    CLS()
    
{
        cout 
<< "this - " << (int)this << endl;
        CLS(
0);
    }

}
;
int  main()
{
    CLS obj;
    cout 
<< obj.m_i << endl;
    return 0;
}

在 winxp + vc6 环境输出如下:
this - 1245052
this - 1244960
-858993460

在 RedHat + G++  环境下输出如下:
this - 1073756940
this - 1073756972
134514604

this 指针的值居然不同,这样意味着
CLS(0);
产生的是一个临时对象,并非调用了 CLS() 函数!!!!

CLS(0); 
这一句其实有歧义(两种意思)
1. 调用 CLS(int i) 函数
2. 产生一个临时对象

编译器选择了后者

如果想调用回 CLS(int i) ,莫非没办法?
聪明的网友们居然想到用 new ~~~~

new  ( this )CLS( 0 );

new 会做两件事
1. 分配内存
2. 调用构造函数

加上了 this

inline  void   * __cdecl  operator   new (size_t,  void   * _P)
{
    
return  (_P); 


告诉 new “您在指定的内存(this)上分配对象吧”
我总觉得这种为取巧方法

以上的问题,写成一个带有默认值的构造函数就行了, Simple~ Make it Simple~
CLS::CLS(int i = 0)
{
}

在应用中应当避免 构造函数里 调用 另一个构造函数 的情况




你可能感兴趣的:(如此构造~)