4

我正在尝试了解类的默认构造函数的工作,但无法弄清楚这种情况:

情况1:

class A  
{  
  public:
     int m;
     string s;
};

然后我创建这个类的对象:
a)A a; // Result: compiler initializing m with garbage value
b)A a = A(); // Result : compiler initializing m with garbage value

案例 2:现在我s从班级中删除了字符串:

class A
{
  public:
    int m;
};

一)A a; // Result: when try to access m I get run time error
二)A a = A(); //Result: m is initialized to zero

Q1) 为什么案例 1 和案例 2 存在差异?
Q2) 如果我在这两种情况下都为我的类提供默认构造函数,那么 a) 和 b) 会是一样的吗?

4

3 回答 3

3

因为在这两种情况下,整数都未初始化。这意味着它的值是未定义的。它可以为零,也可以是整数可以包含的任何其他值。

如果要在默认构造函数中将其初始化为零,可以这样做:

class A
{
  public:
    A::A();
    int m;
};

A::A()
  : m( 0 )
{}

请注意,您不必为 a 提供显式构造函数,string因为它是一个类,并且有自己的默认构造函数。

于 2012-12-19T01:51:30.833 回答
2

案例 1:类A是非 POD。
案例 2:类A是一个 POD。

a) A a; //This is default initialization
b) A a = A(); // This is value initialization

案例'1':m将由编译器生成的默认构造函数初始化为一些垃圾值。

案例“2”:m将被零初始化,因为A是 POD。

在任何情况下,您都不应该发生崩溃。如果你这样做,你可能正在使用一个损坏的编译器。

有关默认初始化和值初始化的更多详细信息,请参阅此链接

于 2012-12-19T02:03:11.860 回答
0

class A案例 1 和案例 2 之间的唯一区别是,在案例 1 中,编译器将综合一个非平凡的默认构造函数,因为sinclass A是一个非原始类型。但是,在这两种情况下,m都没有被初始化。

于 2012-12-19T01:59:48.717 回答