没画完的画

喂马 劈柴 BBQ~
posts - 37, comments - 55, trackbacks - 0, articles - 0
  C++博客 ::  :: 新随笔 :: 联系 :: 聚合  :: 管理

如此构造~

Posted on 2008-10-07 15:09 没画完的画 阅读(1460) 评论(5)  编辑 收藏 引用 所属分类: C++

摘自网上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)
{
}

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




Feedback

# re: 如此构造~  回复  更多评论   

2008-10-07 16:01 by ren54
学习了

# re: 如此构造~  回复  更多评论   

2008-10-07 16:22 by 浪迹天涯
楼主也混cu?

# re: 如此构造~  回复  更多评论   

2008-10-07 18:33 by 万连文
不要用晦涩的语法,用c++经典的好的,那些晦涩的往往是导致问题所在,非必要情况下使用都该打屁股。

# re: 如此构造~  回复  更多评论   

2008-10-08 00:16 by 陈梓瀚(vczh)
这种情况下,希望被调用的构造函数应该被重构成一个独立的函数,然后在两个构造函数内一起使用。

# re: 如此构造~  回复  更多评论   

2008-10-09 10:26 by 908971
受教了

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理