2012-08-03 27 views
2

從C,這個例子在加速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能夠使其超出本地範圍?

回答

9

您可能認爲參考students正被「重新引用」到局部變量pass。不是這種情況。相反,在通過students傳入的現有對象上調用operator=,並將pass中的數據複製到它。

正如你從C來的,你可能更熟悉指針而不是引用。讓我們假設students被聲明爲指針,即

vector<Student_info>* students 

你的問題意味着你相信你所引用的代碼等同於以下

students = &pass; 

的時候,其實就相當於這個

*students = pass; 

這兩個操作的第一個實際上不能在一個引用上執行 - 引用不能被「重新引用」。

+0

現在確定它是有道理的,謝謝 – 2012-08-03 11:59:44

3

pass對象不會轉義本地作用域。

該行students = pass將pass的值 - 對於向量,這是元素 - 複製到學生中。

3

students通過引用傳遞,因此允許修改作爲參數傳遞的原始值。聲明

students = pass; 

就是這麼做的。

相關問題