2013-03-23 82 views
0

我確信之前已經詢問過這個問題,但所有的搜索結果都有const&問題。在參數傳遞參數時保持const正確性問題

我希望確保下面的方法不會改變傳遞給它的GuestNode,所以我想通過const GuestNode& guest,但G ++不會讓這種情況發生,因爲我分配&guest的指針。爲什麼會發生?我怎樣才能確保通過的參數保持原樣?

void GuestList::Add(GuestNode& guest) 
    { 
     if (first == 0) 
     { 
     //first guest 
     first = &guest; 
     } 
     else 
     { 
     //nth guest 
     GuestNode *p = first; 
     while (p->next != 0) 
      p = p->next; 
     p->next = &guest; 
     } 
     SetCount(GetCount() + 1); 
    } 

回答

1

如果您guest一個const GuestNode&,然後&guestconst GuestNode*。也就是說,它是指向const GuestNode的指針。這是有道理的,否則你可以通過非const指針修改const對象。因此,如果您要將該指針分配給first和/或p,則需要確保它們也是const GuestNode*

如果需要first,這我假設是GuestList一員,是非const,那麼你不應該採取const參考。

爲了證明:

const int x = 5; 
int* p = &x; // error: invalid conversion from ‘const int*’ to ‘int*’ 

試想一下,如果這是不是一個錯誤,那麼我能夠做到*p = 10;改變x值,即使對象應該是const

+0

我明白了。但是,如果我先創建const,那麼當我需要擦除列表中的第一個元素並相應地調整第一個指針時,我該做什麼? – Innkeeper 2013-03-23 00:37:38

+0

@Innkeeper您仍然可以修改*指針*。它只是它指向的對象,就是'const'。 – 2013-03-23 00:39:31

+0

好的,但在這個例子中,如果我把'first'改成'const',我還需要用'p'來完成,然後'p-> next =&guest'部分不會編譯。 – Innkeeper 2013-03-23 00:46:23