为什么第18行node*bob=new();
没有给出错误,而第22行nodeactualvalue=new node;
却给出了错误。
#include <iostream>
using namespace std;
class Node{
Node* node;
public:
int data;
};
int main() {
cout << "Hello, World!" << std::endl;
int a = 200;
int* ptr = &a;
cout << a << " pointer is " << ptr << endl;
Node* bob = new Node();
bob->data = 1;
Node actualValue = new Node;
return 0;
}
Node*bob=新节点();
不会出错,因为new Node()
返回指针Node*
,并且bob
的类型也是Node*
。 可以在具有相同类型的指针之间进行赋值。
NodeActualValue=新节点;
给出错误,因为actualValue
的类型是Node
,而类Node
没有任何接受指针Node*
的构造函数。
你必须来自另一种语言,或者是一个完全的初学者,但这不是问题。 我是来帮你的。
在C++中,您可以创建一个堆栈和一个堆变量。 区别在于:
int stack_var = 5;
int* heap_var = new int;
*heap_var = 5;
最大的区别在于,堆变量是用new关键字分配的。 您还必须知道,当作用域结束时(基本上是当您到达分配后的第一个“}”时),堆栈变量将自动释放。但是您必须删除堆变量,如下所示:
delete heap_var;
这将释放内存。 您遇到的主要问题是调用new会返回一个指针。 指针基本上是一个内存地址。 指针基本上与对象声明相同,但我们添加了星号(*)。 像这样:
Someobject object;
Someobject* pointer;
因此要将其包装起来,您必须对代码进行如下修改:
Node* bob = new Node();
bob->data = 1;
Node actualValue;
//This is also important!!!
delete bob;
或者这样:
Node* actualValue = new Node();
delete actualValue;
我没有提到,但这对一个初学者来说可能不是小事:一旦你删除了一些内存,你就再也无法访问它了。
堆栈和堆变量之间的另一个区别:
使用点(。)访问堆栈对象的成员 运算符(stack_obj.foo=5
),如果是指针,则使用箭头(->) 运算符(指针->foo=5
)
希望它清除了它:D
在C++中,当您声明一个类的新实例时,如果构造函数没有参数,您可以跳过括号。
然而,这一行
Node actualValue = new Node;
不正确,因为actualValue变量是在堆栈中,而不是在堆中进行decalred的。 只能将new运算符与指针声明一起使用。