C++对象声明混乱?
C++ object declaration confusion?
我正在尝试用 C++ 实现 BST,我遇到了这两种创建节点的方法:
node* z = new node();
z->key = d;
z->left = NULL;
z->right = NULL;
然后是:
node* y = NULL;
node* x = root;
node* parent = NULL;
叫不叫new算子有什么区别?
编辑
所以例如,有什么区别:
node* q = new node();
和
node* q;
为什么你会选择其中一种方式?一种方式或另一种方式有优势吗?
我很确定(如果我错了请纠正我),使用 new 运算符会为该变量分配动态内存。这些变量很可能已经分配了一些垃圾值,当您为它们分配新值时,这些值会被覆盖。而将其分配为 NULL 只是将 NULL 值分配给它(可能是 0000000)。
回答评论中的问题,是的,有区别。
当你做 node* q = new node()
时,你声明了一个指向 node
对象的指针,然后在运行时为一个 node
对象动态分配足够的内存,并调用默认构造函数(或者,value初始化对象,它依赖于class/struct),最后你把新分配对象的指针赋值给q
.
当您执行 node* q;
时,您只需声明一个指向 node
对象的指针,仅此而已。指针将指向什么取决于在哪里声明指针:如果将其声明为全局变量,则它被初始化为零,并成为空指针;如果你将它声明为一个局部变量,它的值是不确定的,实际上看起来是随机的。两者都不是有效指针,取消引用将导致 undefined behavior。还有第三种选择,那就是在class
或struct
中将node* q;
声明为成员变量,然后初始值取决于class/structure如何创建并初始化(例如,如果结构是值初始化的,是否有初始化它的构造函数等)。
我正在尝试用 C++ 实现 BST,我遇到了这两种创建节点的方法:
node* z = new node();
z->key = d;
z->left = NULL;
z->right = NULL;
然后是:
node* y = NULL;
node* x = root;
node* parent = NULL;
叫不叫new算子有什么区别?
编辑
所以例如,有什么区别:
node* q = new node();
和
node* q;
为什么你会选择其中一种方式?一种方式或另一种方式有优势吗?
我很确定(如果我错了请纠正我),使用 new 运算符会为该变量分配动态内存。这些变量很可能已经分配了一些垃圾值,当您为它们分配新值时,这些值会被覆盖。而将其分配为 NULL 只是将 NULL 值分配给它(可能是 0000000)。
回答评论中的问题,是的,有区别。
当你做 node* q = new node()
时,你声明了一个指向 node
对象的指针,然后在运行时为一个 node
对象动态分配足够的内存,并调用默认构造函数(或者,value初始化对象,它依赖于class/struct),最后你把新分配对象的指针赋值给q
.
当您执行 node* q;
时,您只需声明一个指向 node
对象的指针,仅此而已。指针将指向什么取决于在哪里声明指针:如果将其声明为全局变量,则它被初始化为零,并成为空指针;如果你将它声明为一个局部变量,它的值是不确定的,实际上看起来是随机的。两者都不是有效指针,取消引用将导致 undefined behavior。还有第三种选择,那就是在class
或struct
中将node* q;
声明为成员变量,然后初始值取决于class/structure如何创建并初始化(例如,如果结构是值初始化的,是否有初始化它的构造函数等)。