我是c ++的新手,你能解释一下在这种情况下的指针吗
I'm new to c++ can you explain pointers in this instance
为什么第 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();
- 我是c ++的新手,你能解释一下在这种情况下的指针吗
- 在这种情况下,java对象是否可以调用本机函数
- 在这种情况下显式调用时,std::cout 如何更改析构函数的行为?
- 在这种情况下,我真的复制了字节还是复制了字符?
- 为什么在这种情况下,bool 类型的输出等于 0?
- 在这种情况下,如何传递成员函数而不是函数?
- 为什么在这种情况下递增阵列名称有效?
- 在这种情况下我应该使用哪种设计模式
- 为什么在这种情况下我需要 .template
- 在这种情况下,使用 string_view 是否会导致不必要的字符串复制?
- 我是否访问了已释放的内存,或者在这种情况下DrMemory报告不正确?
- 在这种情况下,"typename..."意味着什么?
- 为什么在这种情况下 x = 44?
- 在这种情况下是私有的吗?试图使操作员<<过载
- 在这种情况下,如何防止C++输出/控制台窗体关闭
- 为什么 lambda nullptr 取消引用在这种情况下有效?
- 为什么在这种情况下,前向声明不起作用?
- 为什么在这种情况下不调用我的虚拟函数实现?
- 在这种情况下,为什么模板即时深度超过限制?
- 有人能向我解释一下在这种情况下发生了什么吗