什么是在C ++中默认初始化的基本类型?

时间:2010-09-27 11:00:24

标签: c++ initialization

当我使用初始化列表时:

struct Struct {
    Struct() : memberVariable() {}
    int memberVariable;
};

基元类型(intboolfloatenum,指针)成员变量是默认初始化。是实现定义的值还是所有实现都相同?

7 个答案:

答案 0 :(得分:34)

你不正确。该对象未默认初始化,但值初始化。它的价值定义明确

int = 0, 
bool = false, 
float = 0.0f,  
enum = (enum type)0, 
pointer = null pointer
pointer to member = null member pointer

请注意,零在任何枚举的值范围内,即使它不包含具有该vaue的显式枚举器,因此将枚举变量初始化为该值是安全的。

特别是对于指向数据成员的指针,实际使用的表示不是全零位。在至少由GCC和Clang使用的所谓的C ++ Itanium ABI中,指向数据成员的指针具有全一位空表示。

答案 1 :(得分:29)

标准说(8.5/5

  

默认初始化T类型的对象意味着:

     

- 如果T是非POD类类型(第9节),则调用T的默认构造函数(如果Thas没有可访问的默认构造函数,则初始化是错误的);

     

- 如果T是数组类型,则每个元素都是默认初始化的;

     

- 否则,该对象为零初始化

  

对T类型的对象进行值初始化意味着:

     

- 如果T是具有用户声明的构造函数(12.1)的类类型(第9节),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的); < / p>      

- 如果T是没有用户声明的构造函数的非联合类类型,则T的每个非静态数据成员和基类组件都是值初始化的;

     

- 如果T是数组类型,则每个元素都是值初始化的;

     

- 否则,对象为零初始化

  

是实现定义的值还是所有实现都相同?

因此所有实现的值都相同。

Struct是非POD类型,所以

 Struct *a =new Struct; // default initialization

 //memberVariable will be initialized to 0 because if T is a non-POD class type
 //the default constructor for T is called 

 Struct *b = new Struct(); //value initializes Struct, which calls the default ctor.

 //memberVariable will be initialized to 0 in this case also.

编辑

由于@Johannes注意到原始类型(int,bool,float,enum,pointer)成员变量为value-initialized而不是default initialized

答案 2 :(得分:10)

对于基本类型,默认初始化表示该对象初始化为0,0.0或NULL,适合该类型。

编辑:以上内容适用于C ++ 98。在C ++ 03中,术语重新定义了一下。现在,使用()的初始化(在语法上只对成员对象可用)会导致值初始化,对于基本类型,这意味着适当的值0,0.0或NULL得到存储

答案 3 :(得分:3)

0

如果在基元上调用(),效果与分配默认值相同,如果它是静态的,则会给出它。

答案 4 :(得分:0)

具有自动和动态存储持续时间的非类变量的默认初始化产生具有不确定值的对象(静态和线程局部对象初始化为零)

引用和常量标量对象不能被默认初始化。 看下面的例子

#include <string>
 
struct T1 { int mem; };
 
struct T2
{
    int mem;
    T2() { } // "mem" is not in the initializer list
};
 
int n; // static non-class, a two-phase initialization is done:
       // 1) zero initialization initializes n to zero
       // 2) default initialization does nothing, leaving n being zero
 
int main()
{
    int n;            // non-class, the value is indeterminate
    std::string s;    // class, calls default ctor, the value is "" (empty string)
    std::string a[2]; // array, default-initializes the elements, the value is {"", ""}
//  int& r;           // error: a reference
//  const int n;      // error: a const non-class
//  const T1 t1;      // error: const class with implicit default ctor
    T1 t1;            // class, calls implicit default ctor
    const T2 t2;      // const class, calls the user-provided default ctor
                      // t2.mem is default-initialized (to indeterminate value)
}

答案 5 :(得分:-1)

这取决于你如何实例化一个类,如果你使用ClassName(),POD类默认初始化为零,非POD类默认构造函数被调用但是如果使用ClassName,没有括号则不会发生默认初始化。 / p>

答案 6 :(得分:-2)

像int这样的本地类型通常会获得garbage value,例如。无论发生在它所创建的内存区域中的任何内容。但是这并没有在标准中定义,它也可能被初始化为0,这在例如很常见。调试版本。

EDIT。但基本上,你永远不应该相信一个未初始化的变量来保存特定的东西;始终自己定义值。