C++结构中指针的默认值

value by default for a pointer in a structure in C++

本文关键字:默认值 指针 结构 C++      更新时间:2023-10-16

我有一个名为Nodestruct,它有两个属性:一个是int v,另一个是叫childNode*。如果我没有为struct显式提供构造函数,那么默认情况下child会接收什么值?

struct Node   
{
    int v;
    Node * child; 
};

它似乎不是NULL指针,所以我不得不在我的结构中编写一个构造函数

struct Node   
{
    int v;
    Node * child; 
    // constructor
    Node():v(0),child(NULL){}
};

它将被取消初始化。在构造函数初始化器列表或构造函数主体中设置其值之前读取它是未定义的行为。

请注意,有两个例外:具有static存储持续时间的变量和使用new Node()创建的对象(与new Node相反)。在这两种情况下,对象都将被初始化为零。

在这种情况下,child指针的初始值将取决于在对象定义点确定的外部因素:Node对象和初始值设定项(如果有)的存储持续时间。

  • 如果声明一个具有静态存储持续时间的Node对象,则指针将初始化为零。

    Node n1; // `n1.child` is null pointer
    void foo()
    {
      static Node n2; // `n2.child` is null pointer
    }
    
  • 如果您声明一个具有自动存储持续时间和初始化器的Node对象,则指针将按照初始化器的指示进行初始化

    void foo()
    {
      Node n3{}; // `n3.child` is null pointer
      Node n4 = { 42 }; // `n4.child` is null pointer
    }
    
  • 如果您声明一个具有自动存储持续时间且没有初始化器的Node对象,则指针将不会在所有中初始化

    void foo()
    {
      Node n5; // `n5.child` is garbage value
    }
    
  • 如果使用初始化器动态分配Node对象,则指针将按照初始化器的指示进行初始化

    Node *n6 = new Node(); // `n6->child` is null pointer
    Node *n7 = new Node{}; // `n7->child` is null pointer
    Node *n8 = new Node{ 42 }; // `n8->child` is null pointer
    
  • 如果在没有初始化器的情况下动态分配Node对象,则指针将不会在所有中初始化

    Node *n9 = new Node;   // `n9->child` is garbage value
    
  • 如果将Node声明为较大对象的子对象,初始化规则将从较大对象传播到Node子对象。

如果你希望你的类成员在所有情况下都是零初始化的,你可以显式地写一个构造函数或使用C++11成员初始化语法

struct Node   
{
    int v = 0;
    Node *child = nullptr; 
};