C ++中未设置布尔值的默认值?

时间:2011-10-23 02:24:03

标签: c++ boolean

  

可能重复:
  Why is a C++ bool var true by default?

说我要做这样的事情:

class blah
{
  public:
  bool exampleVar;
};

blah exampleArray[4];
exampleArray[1].exampleVar = true;

在exampleArray中,现在有3个未设置的exampleVar实例,没有我设置它们的默认值是什么?

7 个答案:

答案 0 :(得分:45)

默认值取决于声明exampleArray的范围。如果它是函数的本地值,则值将是随机的,无论这些堆栈位置恰好是什么值。如果它是静态的或在文件范围(全局)声明,则值将初始化为零。

Here's示威游行。如果您需要成员变量具有确定性值,请始终在构造函数中初始化它。

class blah
{
  public:
  blah() 
  : exampleVar(false)
  {}

  bool exampleVar;
};

修改
C ++ 11不再需要上例中的构造函数。数据成员可以在类声明本身中初始化。

class blah
{
  public:
  bool exampleVar = false;
};

如果需要,可以由用户定义的构造函数覆盖此内联默认值。

答案 1 :(得分:8)

struct x
{
    bool b;

    x() : b() { }
}

...
x myx;

在这种情况下,myx.b将为false。

struct x
{
    bool b;
}

...
x myx;

在这种情况下,myx.b将是不可预测的,它将是分配myx之前内存位置的值。

因为在C和C ++中,假值被定义为0并且真值被定义为非零,所以随机地址位置包含真值而不是伪值的可能性更大。通常,在C ++中,sizeof(bool)为1,表示8位。有超过255种可能性,内存的随机位置是错误的,这就解释了为什么你认为默认的布尔值为真。

答案 2 :(得分:3)

他们的默认值是未定义的。你不应该依赖它们被设置为一个或另一个,并且通常被称为“垃圾”。

根据您的编译器,它可能设置为false。但即便如此,你最好还是设置它们。

答案 3 :(得分:2)

默认值为 indeterminate 。每次运行程序时可能都不同。您应该将值初始化为某个值,或者使用另一个变量来指示您的私有成员未初始化。

答案 4 :(得分:2)

不确定

非静态成员变量需要初始化,除非您可以保证对它们执行的第一个操作是写入。最常见的方式是通过构造函数。如果您仍然需要no-arg / no-op构造函数,请使用初始化列表:

public:
blah() : exampleVar(false) {}

答案 5 :(得分:2)

@Praetorian:在答案中涵盖了要点。

但值得注意的是。

blah exampleArray[4];         // static storage duration will be zero-initialized 
                              // ie POD member exampleVar will be false.

void foo()
{
    blah exampleArray1[4];    // automatic storage duration will be untouched.
                              // Though this is a class type it only has a compiler 
                              // generated constructor. When it is called this way 
                              // it performs default-construction and POD members
                              // have indeterminate values


    blah exampleArray2[4] = {};  // Can force zero-in initialization;
                                 // This is list-initialization.
                                 // This forces value-initialization of each member.
                                 // If this is a class with a compiler generated constrcutor
                                 // Then each member is zero-initialized


    // following through to non array types.
    blah       tmp1;            // Default initialized: Member is indeterminate
    blah       tmp2 = blah();   // Zero Initialized: Members is false

    // Unfortunately does not work as expected
    blah       tmp3();          // Most beginners think this is zero initialization.
                                // Unfortunately it is a forward function declaration.
                                // You must use tmp2 version to get the zero-initialization 
}

答案 6 :(得分:1)

未分配的默认值在C / C ++中未定义。如果需要特定值,则为类blah创建构造函数并设置默认值。