2

来自 C,Accelerated C++ 第 5 章中的这个例子引起了我的注意:

vector<Student_info> extract_fails(vector<Student_info>& students) {

    vector<Student_info> pass, fail;

    for (vector<Student_info>::size_type i = 0; i != students.size(); ++i)
        if (fgrade(students[i]))
            fail.push_back(students[i]);
        else
            pass.push_back(students[i]);

    students = pass;
    return fail;
}

既然fail是返回的,我知道它是一个局部变量不是问题。但是为什么pass能够使其脱离本地范围呢?

4

3 回答 3

9

您可能认为该引用students正在“重新引用”到局部变量pass。不是这种情况。相反,operator=正在调用通过 传入的现有对象students,并将数据从pass复制到它。

当您来自 C 语言时,您可能更熟悉指针而不是引用。让我们假设它students被声明为一个指针,即

vector<Student_info>* students

您的问题意味着您认为您引用的代码等同于以下内容

students = &pass;

实际上它相当于这个

*students = pass;

事实上,这两个操作中的第一个不能在引用上执行——引用不能被“重新引用”。

于 2012-08-03T11:49:12.737 回答
3

pass对象不会逃脱本地范围。

该行将students = passpass 的值(对于向量,这是元素)复制到学生中。

于 2012-08-03T11:46:28.353 回答
3

students通过引用传递,因此允许修改作为参数传递的原始值。该声明

students = pass;

就是这样做的。

于 2012-08-03T11:46:28.960 回答