Posted on 2008-10-07 15:09
没画完的画 阅读(1468)
评论(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
代码:
我以为输出会是 0 No, 在 winxp + vc 和 RedHat + G++ 环境下
输出的值都为一个
未初始化的值
修改代码如下
在 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)
{
}
在应用中应当避免 构造函数里 调用 另一个构造函数 的情况