csdn上看到一个问题 http://topic.csdn.net/u/20090714/00/e7dad941-daf0-4905-a679-7a56ff412f77.html?80540#replyachor
原文如下:
#include <iostream>
using namespace std;
class test{
public:
//test(){}
int x;
int y;
};
int main()
{
test t;
cout < <t.x < <t.y < <endl;
return 0;
}
代码如上,按理说我在test中没有定义构造函数,编译器会为我添加一个默认构造函数,将x和y初始化为随机值,但是实际上当我运行上面的程序的时候,ERROR,提示我t没有初始化。
经过我的测试,
其中watergear 的回复,我觉得很好:
你估计用的是debug模式,你改为release模式,估计就没有错误警告了。
在debug模式下,VC会为一些未初始化的内存空间,填充一些固定值(例如0xCC)。好处是,当调试程序时,如果把异常选项打开,可以很容易发现内存越界或泄漏的情况。
而release模式,则会忽略所有这些错误。
讨论有没有默认构造函数,是没有意义的。因为即使编译自动生成构造函数,那也是什么都没做的空函数。有和没有是一样的。
我们看反汇编
004113DD A1 A0824100 mov eax, dword ptr [<&MSVCP80D.std::endl>]
004113E2 50 push eax
004113E3 8BFC mov edi, esp
004113E5 8B4D F8 mov ecx, dword ptr [ebp-8]
004113E8 51 push ecx
004113E9 8BDC mov ebx, esp
004113EB 8B55 F4 mov edx, dword ptr [ebp-C]
004113EE 52 push edx
004113EF 8B0D 9C824100 mov ecx, dword ptr [<&MSVCP80D.std::cout>] ; MSVCP80D.std::cout
004113F5 FF15 98824100 call dword ptr [<&MSVCP80D.std::basic_ostream<char,>; MSVCP80D.std::basic_ostream<char,std::char_traits<char> >::operator<<
004113E5 8B4D F8 mov ecx, dword ptr [ebp-8] //t.y
004113EB mov edx,dword ptr [t]
004113EB 8B55 F4 mov edx, dword ptr [ebp-C] //t.x
为什么t.x 不是ebp-4 呢
004113DD mov eax,dword ptr [__imp_std::endl (4182A0h)]
004113E2 push eax
位置让给endl 了
从这里可以看出,class 分配在堆栈里了,如果用new 呢
test* t=new test();
我们看到t->x,t->y 都初始化为0
总结:
分配内存的方式不同
test t; 这是在堆栈中分配的,没有默认的构造函数
test t=new test(); 堆分配,有默认的构造函数,t->x,t->y 初始化为0
如果test t有显示构造函数
test()
{
x=1;
y=2;
}
那么test t; 会调用构造函数