Minwoo Dev.
[C++] 배열의 인덱스 연산자 오버로딩, operator[] 본문
728x90
반응형
SMALL
배열은 인덱스 연산자를 사용하여 해당 인덱스의 값을 반환하게 된다.
예를 들어서,
int arr[5] = {1,2,3,4,5};
cout<<arr[3]<<endl;
위 코드에서 arr[3]은 arr 배열의 4번째 인덱스, 즉 4를 반환하고, 그것을 출력하게 된다.
이처럼 배열 인덱스 연산자인 [] 는 해당 인덱스의 값을 반환하는 역할을 한다.
하지만, 이러한 배열에서 해당하지 않는 인덱스의 값을 반환하려 하면 에러가 발생하고 프로그램이 종료된다.
우리는 이 인덱스 연산자의 단점인 해당하지 않는 인덱스에 접근하는 경우를 수정하여 배열의 인덱스 연산자를 오버로딩 해보겠다.
operator[]
기본적인 형태는 아래와 같다.
int& operator[](int idx){
return arr[idx];
}
우리는 int형 배열에 대한 인덱스 연산자를 오버로딩 하기 때문에 반환값이 int& 이지만, 다른 자료형의 배열을 다루려면 반환형만 바꿔주면 된다.
위 형태에 배열의 길이 내에서의 인덱스가 아닌 경우에 에러를 발생시키도록 코드를 추가해보겠다.
배열의 범위를 확인하는 클래스를 정의하고, 멤버함수로 배열 인덱스 연산자 오버로딩을 추가한다.
class BoundCheckIntArray{
private:
int *arr;
int arrlen;
public:
BoundCheckIntArray(int len):arrlen(len){
arr = new int[len];
}
int& operator[](int idx){
if(idx<0 || idx>=arrlen){ // 배열 범위 밖일 때
cout << "Array index out of bound exception" << endl;
exit(1);
}
return arr[idx];
}
~BoundCheckIntArray(){
delete[] arr;
}
};
위 코드를 보게되면, 멤버변수로 arrlen을 가지고 있다.
이 배열의 길이인 arrlen을 가져와서 operator[] 함수에서 해당 범위에 속하는 인덱스인지 검사하는 것이다.
main함수도 추가하여 실행해보겠다.
전체 코드
#include<iostream>
using namespace std;
class BoundCheckIntArray{
private:
int *arr;
int arrlen;
public:
BoundCheckIntArray(int len):arrlen(len){
arr = new int[len];
}
int& operator[](int idx){
if(idx<0 || idx>=arrlen){
cout << "Array index out of bound exception" << endl;
exit(1);
}
return arr[idx];
}
~BoundCheckIntArray(){
delete[] arr;
}
};
int main(void){
BoundCheckIntArray arr(5);
for (int i = 0; i < 5;i++)
arr[i] = (i + 1) * 11;
for (int i = 0; i < 6;i++)
cout << arr[i] << endl;
return 0;
}
실행 결과
728x90
반응형
LIST
'C++' 카테고리의 다른 글
[C++] 포인터 연산자 오버로딩, operator*, operator-> (2) | 2024.07.23 |
---|---|
[C++] operator new, operator new[] (1) | 2024.07.23 |
[C++] 윤성우의 열혈 C++ 11-2 C++ 기반의 데이터 입출력 문제풀이 (0) | 2024.07.21 |
[C++] 윤성우의 열혈 C++ 11-1 깊은 복사를 하는 대입 연산자의 정의 문제풀이 (0) | 2024.07.21 |
[C++] << 연산자 오버로딩, >> 연산자 오버로딩 , istream, ostream (1) | 2024.07.19 |