提问者:小点点

我是C++的新手,你能解释一下这个实例中的指针吗


为什么第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;
}

共3个答案

匿名用户

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运算符与指针声明一起使用。

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(c++|新手|解释一下|实例|中|指针)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?