我们知道编译器为用户定义的类生成一些成员函数,如果该成员函数未定义但未使用,则不是。所以我有这样的代码:
class AA
{
};
void main()
{
AA a;
AA b(a);
a = b;
}
此代码工作正常。我的意思是没有编译错误。但是下面的代码......
class AA
{
int member1;
int member2;
};
但是这段代码给出了运行时错误,因为变量“a”在没有被使用的情况下被使用!!!
所以我的问题是:当我们实例化一个int时,它有一个值。那么为什么默认的构造函数不起作用,并且使用这两个int数字初始化变量“a”??
编辑:平台:Win Vista,编译器:Visual Studio 2008编译器;标志:默认
答案 0 :(得分:6)
编译器合成的默认构造函数为具有构造函数的所有类成员调用默认构造函数。但是整数没有构造函数,因此没有初始化。但是,我发现很难相信这会导致运行时错误。
初始化这些变量:
class AA {
public:
AA() : member1(0), member2(0) {}
private:
int member1;
int member2;
};
答案 1 :(得分:1)
首先,从实际角度来看,这不是一个真正的运行时错误。这是开发环境的内置调试功能。当您读取未初始化的值时,编译器会尝试捕获这种情况,这正是您的情况所发生的情况。
其次,当我们“实例化”int
时,没有值。更确切地说,它包含一个未确定的值,甚至不能保证稳定(您可以通过连续多次读取相同的未初始化变量来获得不同的值)。从理论上讲,读取未初始化的int
变量会导致未定义的行为,因为它可能包含非法(“陷阱”)表示。实际上,您可以将开发环境生成的“运行时错误”视为未定义行为的表现。
答案 2 :(得分:0)
什么平台?编译器?编译器标志?您必须添加一些额外的检查,因为正常的C ++中没有任何内容可以检查初始化状态。
答案 3 :(得分:0)
实际上,默认和复制构造函数确实有效。但在cpp中,未初始化的变量实际上包含垃圾。因此,您收到了错误消息(int member1
,int member2
包含垃圾,并且您尝试将此垃圾分配给b
对象。
答案 4 :(得分:0)
首先,在没有初始化的情况下实例化int时,它具有不确定的值。内置的基本类型没有构造函数。
其次,该代码不应生成运行时错误。它只是在自动生成的复制构造函数和赋值运算符中复制不确定的int值。它应该生成一个编译器警告,表明正在使用未初始化的变量。
第三,你对main的签名是错误的 - 正确的签名是
int main(void)