C++结构中指针的默认值
value by default for a pointer in a structure in C++
我有一个名为Node
的struct
,它有两个属性:一个是int v
,另一个是叫child
的Node*
。如果我没有为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;
};
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 具有默认值的引用获取函数
- 为什么在使用指针时不采用类成员的默认值,而不是直接实例化对象时?
- char指针或char变量的默认值是多少
- 指针参数的默认值
- 指针的默认值
- 从指针访问值或获取其默认值(如果为 null)的最干净方法
- 将指针指向函数的函数和将默认值作为参数的向量会导致编译错误
- 将重载函数分配给功能指针作为默认值
- 新的STD :: MAP条目中指针的默认值
- 是指针定义行为映射中 nullptr 的默认值
- 构造函数中指针到指针的默认值存在问题
- 将包装器与函数指针一起使用来处理参数的默认值
- Howto:c++函数指针与默认值
- 如何在编译时通过模板形参默认值的名称/指针获取函数的类型
- 指针对成员函数默认值出现与CRTP相关的编译器错误
- 构造函数中指针的默认值是什么意思?
- C++结构中指针的默认值
- 将函数指针上的参数与默认值参数一起丢弃是否有效
- C++中函数指针的默认值