代码之家  ›  专栏  ›  技术社区  ›  Narek

C++中类缺省成员函数的问题(构造函数、析构函数、运算符=、复制构造函数)(缺省cTor、dor、拷贝cor)

  •  1
  • Narek  · 技术社区  · 15 年前

    我们知道编译器会为用户定义的类生成一些成员函数,如果这些成员函数没有定义但被使用了,是吗?所以我有这样的代码:

    class AA
    {
    };
    
    void main()
    {
        AA a;
        AA b(a);
        a = b;
    }
    

    这个代码工作正常。我的意思是没有编译器错误。但是下面的代码……

    class AA
    {
        int member1;
        int member2;
    };
    

    但是这段代码给出了一个运行时错误,因为变量“a”使用时没有被初始化!!!!

    所以我的问题是:当我们实例化一个int时,它有一个值。那么,为什么默认的构造函数不工作,并且使用这两个整数初始化变量“a”??

    编辑:平台:Win Vista,编译器:Visual Studio 2008编译器;标志:默认

    5 回复  |  直到 15 年前
        1
  •  6
  •   anon    15 年前

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

    初始化这些变量:

    class AA {
      public:
         AA() : member1(0), member2(0) {}
      private:
        int member1;
        int member2;
    };
    
        2
  •  1
  •   AnT stands with Russia    15 年前

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

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

        3
  •  0
  •   c-urchin    15 年前

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

        4
  •  0
  •   M. Williams    15 年前

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

        5
  •  0
  •   Joris Timmermans    15 年前

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

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

    第三,你的主要签名是错误的-正确的签名是

    int main(void)