繁体   English   中英

C ++中类的默认成员函数存在问题(构造函数,析构函数,operator =,复制构造函数)(默认ctor,dtor,copy ctor)

[英]Problem with default member functions of class in C++ (constructor, destructor, operator=, copy constructor) (default ctor, dtor, copy ctor)

我们知道,如果未定义但使用了该成员函数,则编译器会为用户定义的类生成一些成员函数,不是吗。 所以我有这种代码:

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编译器; 标志:默认

编译器综合的默认构造函数为所有具有构造函数的类成员调用默认构造函数。 但是整数没有构造函数,因此不会初始化。 但是,我很难相信这会导致运行时错误。

要初始化这些变量:

class AA {
  public:
     AA() : member1(0), member2(0) {}
  private:
    int member1;
    int member2;
};

首先,从实际的角度来看,这不是真正的运行时错误。 这是开发环境的内置调试功能。 当您读取未初始化的值时,编译器会尝试捕获情况,这正是您所遇到的情况。

其次,当我们“实例化”一个int ,它没有值 更准确地说,它包含一个不确定的值,甚至不能保证它是稳定的(您可以通过连续多次读取同一未初始化的变量来获得不同的值)。 从理论上讲,读取未初始化的int变量会导致未定义的行为,因为它可能包含非法(“陷阱”)表示形式。 实际上,您可以将开发环境生成的“运行时错误”视为未定义行为的体现。

什么平台? 编译器? 编译器标志? 您必须添加一些额外的检查,因为普通C ++中没有任何东西可以检查初始化状态。

实际上,默认构造函数和复制构造函数可以正常工作。 但是在cpp中,未初始化的变量实际上包含垃圾。 因此,您会收到错误( int member1int member2包含垃圾桶,并尝试将此垃圾桶分配给b对象)。

首先,当实例化一个int而不初始化它时,它具有不确定的值。 内置基本类型没有构造函数。

其次,该代码不应产生运行时错误。 它只是在自动生成的复制构造函数和赋值运算符中复制不确定的int值。 它应生成一个编译器警告,指出正在使用未初始化的变量。

第三,您对main的签名是错误的-正确的签名是

int main(void)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM