读书人

一个诡异的关于构造函数的有关问题

发布时间: 2012-03-15 11:50:38 作者: rapoo

一个诡异的关于构造函数的问题
class Base
{
public:
int a;
};

Base b1;
fprintf(stdout, "%d ", b1.a);//运行报错,为什么

class Base
{
public:
Base(){}//什么都不做
int a;
};

Base b1;
fprintf(stdout, "%d ", b1.a);//输出-8*****结果,没问题

不是不写构造函数编译器自动帮忙加的么

[解决办法]
vc2003比较高级,如果使用了未初始化的变量,在debug模式下就会出错,比如:
int main()
{
int a;
int b= a+1;
return 0;
}
没有写构造函数,就不会对int之类的成员初始化,这样就和C兼容了。
[解决办法]
这个是和编译器有关的,在VC6.0下不会报错]
在VS2005中对一个没有初始化的变量输出操作运行时会引发错误

当不显示定义构造函数的时候,会生成一个默认的构造函数,但是对于内置型和复合型成员变量,只有定义全局的对象时才会按默认方式初始化,因为你b1对象是在局部定义的,因此成员变量a并没有得到初始化,所以输出必然出错

如果该成下面这种方式,则不会抱错,能正常运行

class Base
{
public:
int a;
};

Base b1;//全局变量

int main()
{
fprintf(stdout, "%d ", b1.a);//ÔËÐб¨´í£¬ÎªÊ²Ã´

return 0;
}


[解决办法]
我觉得唯一影响这个问题的大家就是调试器会跟踪啥东西了,因为这很显然不会真正触发你所说的错误,一定是调试器在跟踪。所以,空的构造函数我想就会阻止调试器去跟踪,如果他去分析你的构造函数,那么分析的代价会比较大

读书人网 >C++

热点推荐