我试图用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;
你为什么选择其中一种方式?这种或那种方式有优势吗?
答案 0 :(得分:3)
要回答评论中的问题,是的,存在差异。
执行node* q = new node()
时,声明指向node
对象的指针,然后在运行时为一个node
对象动态分配足够的内存,并调用默认构造函数(或者,值)初始化对象,它取决于类/结构),最后将指向新分配的对象的指针分配给q
。
执行node* q;
时,您只需声明一个指向node
对象的指针,就是这样。指针指向的内容取决于 where 您声明指针:如果将其声明为全局变量,则将其初始化为零,并变为空指针;如果将它声明为局部变量,则其值是不确定的,并且实际上似乎是随机的。两者都不是有效指针,取消引用它将导致undefined behavior。还有第三种选择,即在node* q;
或class
中将struct
声明为成员变量,然后初始值取决于如何创建和初始化类/结构(例如,如果结构是值初始化,如果有一个初始化它的构造函数,等等。)
答案 1 :(得分:1)
我非常确定(如果我错了,有人会纠正我),使用new运算符为该变量分配动态内存。变量很可能已经为它们分配了一些垃圾值,当您为它们分配新值时,这些值会被覆盖。将NULL赋值为NULL只需将其赋值为NULL值(可能为0000000)。