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。还有第三种选择,那就是在classstruct中将node* q;声明为成员变量,然后初始值取决于class/structure如何创建并初始化(例如,如果结构是值初始化的,是否有初始化它的构造函数等)。