참조자에 대한 정확한 의미와 그 쓰임을 잘 모르겠습니다.
조회수 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 답변
-
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;
라고 생각하면 됩니다.-
(•́ ✖ •̀)
알 수 없는 사용자
-
댓글 입력