2011-05-25 47 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