2013-03-23 128 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