c++默认构造函数的一个问题

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;  会调用构造函数

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值