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;
叫不叫新接线员有什么区别?
编辑
例如,之间有什么区别
node* q = new node();
和
node* q;
你为什么要选择这样或那样的方式?这样或那样有优势吗?
要回答注释中的问题,是的,这是有区别的。
当您执行node* q = new node()
时,您声明一个指向node
对象的指针,然后在运行时为一个node
对象动态分配足够的内存,并调用默认构造函数(或者,值初始化对象,它取决于类/结构),最后将指向新分配对象的指针分配给q
。
当你做 我很确定(如果我错了,有人会纠正我),使用新运算符会为该变量分配动态内存。变量很可能已经分配了一些垃圾值,当您为它们分配新值时,这些垃圾值会被覆盖。而赋予它NULL只是赋予它NULL值(可能是0000000)。node* q;
时,你只需要声明一个指向node
对象的指针,就这样了。指针将指向什么取决于你在哪里声明指针:如果你将其声明为全局变量,它将初始化为零,并变为空指针;如果你把它声明为局部变量,它的值是不确定的,而且在现实中看起来是随机的。两者都不是有效的指针,取消引用它将导致未定义的行为。还有第三种选择,即将node* q;
声明为class
或struct
中的成员变量,则初始值取决于类/结构的创建和初始化方式(例如,如果结构是值初始化的,是否有构造函数对其进行初始化等)
相关文章:
- .cpp和.h文件中的模板专用化声明
- 未在作用域中声明unordered_map
- C++避免重复声明的语法是什么
- 如何确保C++函数在定义之前声明(如override关键字)
- 错误:未在此范围内声明'reverse'
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 为什么在定义函数之前先声明它
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- #ifdef和未声明的标识符
- 没有显式声明的int[]中的foreach
- 在基于范围的for循环中使用结构化绑定声明
- 在将变量声明为引用时,堆在释放后使用
- C++:无法访问声明的受保护成员
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 伟大的 c++ 前向声明混乱
- 关于C 的声明和定义之间的差异的混乱
- 正向声明混乱
- C++转发声明混乱
- C++对象声明混乱
- 为什么声明出现在一个混乱的符号名中