C++ I';我是c+的新手+;你能解释一下这个例子中的指针吗
为什么第18行C++ I';我是c+的新手+;你能解释一下这个例子中的指针吗,c++,pointers,C++,Pointers,为什么第18行节点*bob=new()在第22行节点实际值=新节点时不给我错误可以 #include <iostream> using namespace std; class Node{ Node* node; public: int data; }; int main() { cout << "Hello, World!" << std::endl; int a = 200; int* pt
节点*bob=new()代码>在第22行节点实际值=新节点时不给我错误代码>可以
#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;
}
#包括
使用名称空间std;
类节点{
节点*节点;
公众:
int数据;
};
int main(){
库特
为什么第18行Node*bob=new();没有给我一个错误,而第22行Node actualValue=new Node;没有
有问题的路线是
Node actualValue = new Node;
new Node
返回一个指针,您不能将其分配给Node
类的实例。并且您忘记了在new Node
之后调用构造函数的parantises。正确的代码是
Node *actualValue = new Node();
Node*bob=new Node();
不要给出错误,因为new Node()
返回一个指针Node*
,并且bob的类型也是Node*
。您可以在具有相同类型的指针之间进行赋值
<>代码>节点实际值=新节点;< /COD>错误,因为<代码>实际值>代码>是代码>节点< /代码>,类<代码>节点< /C>没有任何构造函数接受指针<代码>节点*< /C> > .< /p> C++,当你声明一个新的实例时,如果构造函数没有参数,你可以跳过括号。/p>
然而,这条线
Node actualValue = new Node;
不正确,因为actualValue变量在堆栈中贴标,而不是在堆中贴标。您只能在指针声明中使用new运算符。您必须来自另一种语言或是完全的初学者,但这不是问题。我是来帮助您的
<>在C++中,可以创建堆栈和堆变量。这里的差异如下:
int stack_var = 5;
int* heap_var = new int;
*heap_var = 5;
最大的区别在于堆变量是用new关键字分配的。您还必须知道,当范围结束时(基本上是在分配后到达第一个“}”时),堆栈变量会自动释放。但必须删除堆变量,如下所示:
delete heap_var;
Node* bob = new Node();
bob->data = 1;
Node actualValue;
//This is also important!!!
delete bob;
这将释放内存。您遇到的主要问题是调用new返回指针。指针基本上是一个内存地址。指针基本上与对象声明相同,但我们添加了一个asterix(*)。像这样:
Someobject object;
Someobject* pointer;
因此,要结束它,您必须修改如下代码:
delete heap_var;
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
)
希望它能解决这个问题:听起来你可以用一个你不需要父母的电话。没有它们是“正确的”。Node
是一个POD,在它上面调用new
而不使用括号与使用不同。在这个问题上,可以自由引用C++标准,但是请不要用错误的信息编辑正确的答案,我会继续把它滚回去。你没有帮助我学习任何东西(我也不要求你),显然我在帮助你学习。至于您的问题,new Node()
将对结果对象进行零初始化,而new Node
将使其充满内存中的所有垃圾。再次,我将推荐阅读C++标准。是的,或者更具体地说,它不会被任何东西填充,根据标准。gcc特别喜欢0-初始化值,但msvc不会,所以要小心。绕过这个量子“它会被初始化吗?不会吗?”问题的一种方法是添加一个构造函数,这将使您的结构不再是POD,两种形式都会调用您的构造函数来初始化它。这就是为什么你应该总是给你的类添加构造函数除非你绝对确信从零开始的字段的性能增益是值得冒的风险。谢谢,我是C++的新手。我的主要语言是java和Python,所以指针有点棘手。谢谢你消除了我的误解。没问题,伙计!是的,在这些语言中,它被抽象掉了,所以你可以编写代码,在C++中,你会学到低级的东西,但它很有趣。所以继续努力吧!非常感谢。现在这是有道理的。