【问题标题】:C++ object declaration confusion?C++ 对象声明混乱?
【发布时间】:2015-07-01 17:09:07
【问题描述】:

我正在尝试在 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;

为什么你会选择一种方式或另一种方式?一种方式或另一种方式有优势吗?

【问题讨论】:

  • 当然,一个用一个值初始化q,另一个没有,结果是一个wild pointer
  • node *q; 没有对对象 node 的有效引用
  • 顺便说一句,如果您使用的是 C++11 或更新版本,请使用 nullptr 而不是 NULL
  • 并扩展@NathanOliver 的评论,如果您使用的是早期版本的C++,那么建议使用0 而不是NULL
  • @ocean800 原因是int a = NULL; 会编译,而int a = nullptr; 不会。看到这个:stackoverflow.com/questions/13816385/…

标签: c++ object declaration new-operator


【解决方案1】:

要回答评论中的问题,是的,有区别。

当您执行node* q = new node() 时,您声明了一个指向node 对象的指针,然后在运行时为一个node 对象动态分配足够的内存,并调用默认构造函数(或者,值初始化对象,这取决于在类/结构上),最后将指向新分配对象的指针分配给q

当您执行node* q; 时,您只需声明一个指向node 对象的指针,仅此而已。指针将指向什么取决于你声明指针的where:如果你将它声明为一个全局变量,它会被初始化为零,并变成一个空指针;如果将其声明为局部变量,则其值是不确定的,实际上看起来是随机的。两者都不是有效指针,取消引用将导致undefined behavior。还有第三种选择,即在classstruct 中将node* q; 声明为成员变量,然后初始值取决于类/结构的创建和初始化方式(例如,如果结构是值初始化的,如果有一个构造函数来初始化它等等)。

【讨论】:

  • 啊..我明白了。所以除非我使用new node(),否则实际上并没有创建一个新节点。只会创建对节点的引用。
  • @ocean800 没错,几乎...正确的短语是指向节点的指针。 C++ 中的 reference 是另外一回事,类似于指针,但仍然不同。
  • 如果我有node* q,然后是q->key=2。这样有效吗?
  • @gauravsehgal 除非你在两者之间初始化q,即让它指向一个有效的node 对象。
  • @gauravsehgal 因为使用未初始化的指针是未定义的行为。这意味着它可以工作,它不能工作,它可以给你一百万美元,任何东西。请参阅 Joachim 在他的答案末尾的链接。
【解决方案2】:

我很确定(如果我错了,请有人纠正我),使用 new 运算符会为该变量分配动态内存。这些变量很可能已经分配了一些垃圾值,当您为它们分配新值时,这些值会被覆盖。而将其分配为 NULL 只是将其分配为 NULL 值(可能是 0000000)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 1970-01-01
    相关资源
    最近更新 更多