프로그래밍 언어/열혈 C++
11-2 연산자 오버로딩2
당장하자
2022. 3. 17. 22:16
배열 클래스
C, C++의 기본 배열은 "경계검사를 하지않는다"라는 단점이 있다.
arrObject[2];
arrObject를 객체로 보면 arrObject의 멤버함수 operator []를 매개변수 2를 전달하면서 호출하는 문장이다.
int operator[] (int idx) { ... }
arrObject.operator[] (2)
예시)
1차원 배열
#include <iostream>
#include <cstdlib>
using namespace std;
class BoundCheckIntArray
{
private:
int * arr;
int arrlen;
public:
BoundCheckIntArray(int len) :arrlen(len)
{
arr=new int[len];
}
int& operator[] (int idx) const
{
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;
}
2차원 배열(문제 11-2 문제2)
내 풀이
#include <iostream>
#include <cstdlib>
using namespace std;
class BoundCheck2DIntArray
{
private:
int** arr;
int row_len;
int col_len;
public:
BoundCheck2DIntArray(int row, int col) :row_len(row), col_len(col)
{
arr = new int* [row];
for (int i = 0; i < row; i++)
{
arr[i] = new int[col];
}
}
int* operator[](int idx)
{
if (idx < 0 || idx >= row_len)
{
cout << "범위 초과" << endl;
exit(1);
}
return arr[idx];
}
};
int main()
{
BoundCheck2DIntArray arr2d(3, 4);
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 4; j++)
{
arr2d[i][j] = i + j;
}
}
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 4; j++)
{
cout << arr2d[i][j] << " ";
}
cout << endl;
}
return 0;
}