참조자에 대한 정확한 의미와 그 쓰임을 잘 모르겠습니다.

조회수 357회
class point
{
private:
    int* arr;
    int len;
public:
    point(int a)
        :len(a)
    {
        arr = new int[len];
    }
    int& operator[](int a)
    {
        if (a<0 || a>=len)
            exit(1);
        else
            return arr[a];
    }

};
int main()
{
    point p(3);
    for (int i = 0; i < 3; i++)
        p[i] = i;

    return 0;
}

이렇게 했을때는 컴파일이 잘 되는데

class point
{
private:
    int* arr;
    int len;
public:
    point(int a)
        :len(a)
    {
        arr = new int[len];
    }
    int operator[](int a)
    {
        if (a<0 || a>=len)
            exit(1);
        else
            return arr[a];
    }

};
int main()
{
    point p(3);
    for (int i = 0; i < 3; i++)
        p[i] = i;

    return 0;
}

이렇게 했을때는

 p[i] = i;

이 부분에서 식이 수정할 수 없는 lvalue라고 에러가 뜹니다. int 옆의 참조자 때문인데 왜 참조자를 안붙이면 컴파일 에러가 뜨는지 궁금합니다

1 답변

  • 좋아요

    2

    싫어요
    채택 취소하기

    int operator[](int a);

    위의 코드는 함수의 반환값의 형식이 int입니다. 함수는 기본적으로 값에 의한 반환을 하기 때문에, 이 함수를 호출한 곳으로 int형 값이 반환됩니다. 즉, p[i]에 int형 숫자가 반환됩니다.

    따라서 p[i]=i;에서 에러가 나는 이유는 p[i]의 결과로 int형 숫자가 반환되어, 숫자=i;처럼 숫자에 다른 숫자를 대입하라는 코드가 되어 버려서, 숫자는 lvalue가 아니다라는 에러가 뜬 것입니다.

    int& operator[](int a);

    반면에 위와 같이 int뒤에 참조(&)를 붙이게 되면, 반환하고자 하는 값은 이미 선언되어 있는 변수(이름이 있는 없든 상관없이)이고, 반환값이 보내지는 곳(호출한 곳)은 이미 선언되어 있는 변수(반환하고자 하는 값)의 별명이다라는 의미입니다. 질문 코드상으론 클래스의 멤버 변수인 arr의 a번째가 반환됩니다. 따라서 p[i]=i;arr[i]의 별명=i;라고 생각하면 됩니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)