2011-05-25 46 views
3
struct node { 

    int data; 
    struct node* next; 

} 

void push (struct node **head, int data) { 

    struct node* newNode = malloc (sizeof (struct node)); 
    newNode->data = data; 
    newNode->next = *head; 
    *head = newNode;  
} 

//I understand c version well. 

C++ version 

void Stack::push(void *data) { 

     struct node *newNode = new node; 
     newNode->data = data; 
     newNode->next = head; 
     head = newNode; 

} 

在C++头部是栈类的私有或受保护成员,并声明为node * head。c&C++中的指针操作

问题:为什么head可以在C++的push()调用后保留它的值。
在c中,我们需要声明它为**,因为我们想在push()函数调用后改变头指针的值。在C++代码中,调用后不会更改头部丢失吗?

+0

推测head是该类的成员变量。你从中学到了哪一本C++书不包括这个? – 2011-05-25 20:44:46

+0

很多年前我读过C++,但从未使用过。那时我用蓝色封面书。我主要使用c,但也很少。顺便说一句,这是我在这里的第一篇文章,我非常感谢社区如何回应! – user770284 2011-05-25 20:54:39

回答

3

在这种情况下,由于Stack::push是非静态的,因此headthis->head的简写。所以head = newNode是一样的:

this->head = newNode; 
7

这里的问题是你比较到C的C代码++是不是真的类似。一个更好的例子是

typedef struct Node { 
    int data; 
    struct Node* pNext; 
} Node; 

typedef struct Stack { 
    Node* pHead; 
} Stack; 

void push(Stack* this, int data) { 
    Node* newNode = malloc (sizeof (Node)); 
    newNode->data = data; 
    newNode->next = this->head; 
    this->head = newNode; 
} 

在这个版本中,我们已经成功地实施push,而不必采取**的头。我们有一种方式,因为它通过Stack*双重间接。但是这与C++的工作方式非常相似。可以将C++视为传递this作为该函数的隐藏参数。

+0

为了使这一点更清晰,可以将'pStack'重命名为'this'(因为后者不是C中的保留字)。 – 2011-05-25 20:47:10

+0

@Chris谢谢,更新 – JaredPar 2011-05-25 20:47:34