프로그래밍 언어/열혈 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;
}