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