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;

これら 2 つの操作の最初の操作は、実際には参照に対して実行できません。参照を「再参照」することはできません。

于 2012-08-03T11:49:12.737 に答える
3

オブジェクトはpassローカル スコープをエスケープしません。

この行students = passは pass の値 (ベクトルの場合、これは要素です) を生徒にコピーします。

于 2012-08-03T11:46:28.353 に答える
3

students参照によって渡されるため、パラメーターとして渡された元の値を変更できます。ステートメント

students = pass;

それだけです。

于 2012-08-03T11:46:28.960 に答える