1

C++ では、for-each ステートメントで参照変数を使用できます。たとえばfor (int &e : vec)、 where&eは の値への参照ですe。これにより、for-each ループで対話する要素の値を変更できます。Javaに同等の構造はありますか?

C++ の for-each ループで参照変数を使用する方法の例を次に示します。

#include <iostream>
#include <vector>

int main()
{
    // Declare a vector with 10 elements and initialize their value to 0
    std::vector<int> vec (10, 0); 

    // e is a reference to the value of the current index of vec
    for (int &e : vec)
        e = 1;

    // e is a copy of the value of the current index of vec
    for (int e : vec)
        std::cout << e << " ";

    return 0;
}

参照演算子 が最初のループで使用されなかった場合、 1 への割り当ては、 の現在の要素のコピー (参照ではない) である&変数に対してのみ行われます。つまり、ベクトルから読み取るだけでなく、また、for-each ループでベクトルに書き込みます。evec&

たとえば、次の Java コードは元の配列を変更せず、単にコピーを変更します。

public class test {

    public static void main(String[] args) {
    test Test = new test();

    int[] arr = new int[10];

    for (int e : arr)   // Does not write to arr
        e = 1;

    for(int e : arr)
        System.out.print(e + " ");
    }
}
4

3 に答える 3

4

いいえ、ありません。そしてとにかく、コレクションの反復中にコレクションを変更すると、ほとんどのコレクションはConcurrentModificationExceptionをスローします。

ただし、コレクションに含まれるオブジェクトを変更することを禁じるものはありません。

for (Customer c : customers) {
    c.setActive(false);
}

リストの場合、ListIteratorを使用して、反復中に現在の要素を置き換えることができます。http://docs.oracle.com/javase/6/docs/api/java/util/ListIterator.htmlを参照してください

于 2012-09-29T13:38:15.360 に答える
2

Java では、オブジェクトは参照によって渡され、他のすべての型は値によって渡されます。

eつまり、ループ内で変更する方法はありません。これはint(つまり、値のコピーに書き込んでいる) ためです。

ただし、オブジェクトのコレクションをループしている場合、それらを変更するために必要なメソッドを公開している限り、オブジェクトの変更を妨げるものは何もありません。参照ではなく、値の変更に制限されています (つまり、オブジェクト自体を変更できますが、別のオブジェクトに変更することはできません)。

于 2012-09-29T13:42:13.053 に答える
1

Java では C++ のような参照はありません。

リスト オブジェクトを変更する場合は、ベクターを昔ながらの方法で処理する必要があります。

for (int = 0; i < vector.size(); i++) {
Object oldObject = vector.get(i);
vector.set(i, newObject);
}

ただし、オブジェクトの内容を変更したい場合は、foreach を使用するとうまくいきます。

for (SomeObject o : list) {
o.setName("foo");
}
于 2012-09-29T13:42:02.950 に答える