我是c ++的新手,你能解释一下在这种情况下的指针吗

I'm new to c++ can you explain pointers in this instance

本文关键字:一下 这种情况下 指针 新手 能解释 我是      更新时间:2023-10-16

为什么第 18 行Node* bob = new();没有给我错误,而第 22 行节点actualValue = 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();

不会给出错误,因为new Node()返回一个指针Node*并且bob的类型也是Node*。可以在具有相同类型的指针之间执行分配。

Node actualValue = new Node;给出错误,因为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) 访问堆栈对象的成员,而在指针的情况下,使用箭头 (->) 运算符 (pointer->foo = 5)

希望它清除它:D

C++声明类的新实例时,如果构造函数没有参数,则可以跳过括号。

然而,这条线

Node actualValue = new Node;

不正确,因为 actualValue 变量是在堆栈中贴花的,而不是在堆中。只能将 new 运算符与指针声明一起使用。

为什么第

18 行 Node* bob = new(); 当第 22 行节点实际值 = 新节点时不给我错误;

有问题的行是

Node actualValue = new Node;

new Node返回指针,则不能将其分配给Node类的实例。而且您在调用构造函数new Node后忘记了您的参数。正确的代码是

Node *actualValue = new Node();