C++将列表作为参数传递给函数

18

我正在尝试构建一个非常简单的通讯录。我创建了一个联系人类,而通讯录是一个简单的列表。我正在尝试构建一个函数,以允许用户将联系人添加到通讯录中。如果我将代码放在函数外部,它可以正常工作。但是,如果我把它放在函数里面,它就不能正常工作。我认为这是传递引用与传递值的问题,我没有正确地处理它。这是该函数的代码:

void add_contact(list<Contact> address_book)
{
     //the local variables to be used to create a new Contact
     string first_name, last_name, tel;

     cout << "Enter the first name of your contact and press enter: ";
     cin >> first_name;
     cout << "Enter the last name of your contact and press enter: ";
     cin >> last_name;
     cout << "Enter the telephone number of your contact and press enter: ";
     cin >> tel;

     address_book.push_back(Contact(first_name, last_name, tel));
}

我没有收到任何错误提示,但当我尝试显示所有联系人时,只能看到原始联系人。


当调用add_contact(addressBook)时,list<Contact> addressBook没有被更新。 - Adrian
4个回答

16

您传递的是地址簿的值(address_book),因此会创建该值的副本,当您离开add_contact的范围时,更改将丢失。

请改为通过引用传递:

void add_contact(list<Contact>& address_book)

每个STL数据结构都是按值传递的吗? - Rahul
@Rahul:C++作为一种语言具有值语义 - 按值传递与按引用传递的决定是基于每个函数而不是每个类型的。 - ildjarn

2
因为您是按值传递列表,所以它会被复制,新元素会添加到在add_contact内部的本地副本中。
解决方案:通过引用进行传递。
void add_contact(list<Contact>& address_book).

1

按引用传递

void add_contact(list<Contact>& address_book).

1
使用 void add_contact(list<Contact> & address_book) 通过引用传递地址簿。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接