2016년 7월 10일 일요일

C++에서의 for each

C++ 0x버전에서 새로 추가된 for each문은 배열이나 벡터 등에 대해 다음과 같이 사용할 수 있습니다.


main()
{
    int arr[100];
    input(arr);
    for each(int a in arr)
        printf("a = %d\n", a);
}

하지만 이때 for each의 변수를 reference로 선언된다면 내부적으로 const로 정의되므로 내부변수를 수정하는 것에는 사용 불가입니다.



class Student
{
private :
    char Name[32];
    int Kor;
    int Mat;
    int Eng;
public :
    Student();
    ~Student();
    void LoadFromFile();
};

위와 같은 변수에 대해서

main()
{
    Student arr[100];
    for each(Student a in arr)
        a.LoadFromFile();
}

와 같이 한다면, a에는 arr 각 원소의 복사본이 들어가므로 정작 arr 원소들에 로드되지는 않습니다. 로드된 데이터는 arr의 원소가 아니라 arr의 원소의 복사본에 들어갔다가, 메모리 해제되며 사라지죠.

그렇다고 해서


main()
{
    Student arr[100];
    for each(Student &a in arr)
        a.LoadFromFile();
}

이렇게 하면 a는 반드시 const reference여야 하므로 컴파일 에러가 납니다.


이 경우에는 배열이 아닌 포인터의 배열을 사용해서 다음과 같이 코딩해야 합니다.

main()
{
    Student *arr[100];
    for(int k = 0; k < 100; ++k)
        arr[k] = new Student;
    for each(Student *a in arr)
        a->LoadFromFile();
}