为什么"&"在调用此列表时需要吗?

时间:2015-12-13 22:08:17

标签: c++ list

我正在研究LIST并使用功能,这个程序给出10个数字,如果输入的数字大于我们列表中的最大值,那么这个数字将被添加到我们的列表中,最后在10次尝试之后所有成员会出现。该计划工作正常,但我不明白为什么我需要使用"&"在第6行:" void insertMax(list& lst,int n){" ??

#include <iostream>
#include <list>

using namespace std;

void insertMax(list<int> &lst, int n) {
    lst.sort();
    int max = lst.back();
    if (n > max) {
        lst.push_back(n);
    }
}

void disply(list<int> lst) {
    list<int>::iterator iter = lst.begin();
    while (iter!=lst.end()){
        cout << *iter << endl;
        iter++;
    }
}

int main()
{
    list<int> numbers;
    numbers.push_back(0);
    int input=0;
    for (int j = 1; j < 11; j++){
        cout << "Enter a number: " << endl;
        cin >> input;
        insertMax(numbers, input);
    }
    cout << "Now that's all: " << endl;
    disply(numbers);
    return 0;
}

提前致谢。

4 个答案:

答案 0 :(得分:2)

所以你传递了对列表的引用而不是它的副本。

Google&#34;通过引用传递&#34;和&#34;传递价值&#34;。

通过引用传递意味着您不必复制您传递的整个数据结构(这可能很慢 - 特别是如果您有一个大清单)

话虽如此,你的疑问并不十分清楚:&#34;为什么&amp;在拨打此列表时需要?&#34; - 第6行不是通话,它是功能签名的声明。所以它说'#34;当你给我打电话时,我希望你把一个引用列表提交给#34;

答案 1 :(得分:1)

通过放入&符号(&amp;),您可以指定将列表作为参考,而不是将其复制到函数范围中。通过将其作为参考,您可以操纵外部对象。 http://www.cprogramming.com/tutorial/references.html

答案 2 :(得分:0)

如果您不添加'&amp;' (通过引用传递),您对InsertMax函数中的List所做的任何更改都不会影响main方法中的列表。

这就是为什么你有时会看到声明为

的C ++方法签名的原因
void DoSomething(const std::string &value)  
{
    /*Method Body*/
}

这样做是为了使value字符串中的所有数据都不会复制到内存中的新位置。如果DoSomething方法需要修改值字符串,则需要首先在函数内部复制它。 const修饰符确保该方法的引用是只读的。

例如:

std::string DoSomething(const std::string &value)  
{
    std:string result = value + "some other data";
    return result;
}

答案 3 :(得分:0)

如果我理解正确,第6行是函数定义的起始行

void insertMax(list<int> &lst, int n) {
    lst.sort();
    int max = lst.back();
    if (n > max) {
        lst.push_back(n);
    }
}

第一个参数声明中的符号&表示该参数将是原始参数的refence。因此,函数中列表的任何更改都会影响原始参数。

如果要移除此符号&,例如

void insertMax(list<int> lst, int n) {
//...

这意味着该函数将处理原始参数的副本。在这种情况下,参数副本的参数的任何更改都不会影响原始参数。

因此新项目将添加到列表的副本中,但列表本身不会更改。它的副本将被更改。