C ++对象声明混淆?

时间:2015-07-01 17:09:07

标签: c++ object declaration new-operator

我试图用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;

你为什么选择其中一种方式?这种或那种方式有优势吗?

2 个答案:

答案 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)。