배열의 인덱스 연산자 오버로딩
#include <iostream>
#include <vector>
using namespace std;
class BoundCheckIntArray {
private:
int* arr;
int arrlen;
public:
BoundCheckIntArray(int len)
:arrlen(len)
{
arr = new int[len];
}
int& operator[] (int index)
{
if (index < 0 || index >= arrlen)
{
cout << "Array index out of bound exception " << endl;
exit(1);
}
return arr[index]; //참조형 반환 (배열 요소의 참조값이 반환되고, 참조값이므로 변경도 할 수 있다.)
}
~BoundCheckIntArray()
{
delete[] arr;
}
};
int main()
{
BoundCheckIntArray arr(5); // 멤버 변수 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;
}
배열 접근의 안정성 보장
#include <iostream>
using namespace std;
class BoundCheckIntArray {
private:
int* arr;
int arrlen;
BoundCheckIntArray(const BoundCheckIntArray& arr) {}
BoundCheckIntArray& operator=(const BoundCheckIntArray& arr) {}
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];
}
// 참조형을 반환하지 않고, const 형태로 반환한다 .
int operator[] (int idx)const
{
if (idx < 0 || idx >= arrlen)
{
cout << "Array index out of bound exception" << endl;
exit(1);
}
return arr[idx];
}
int GetArrLen() const { return arrlen; }
~BoundCheckIntArray() { delete[] arr; }
};
void SHowAllData(const BoundCheckIntArray& ref) // 객체의 배열에 저장된 모든 요소 출력
{ // const로 매개변수 가져오기 (힘수 내 저장된 데이터 변경 X)
int len = ref.GetArrLen();
for (int idx = 0; idx < len; idx++)
cout << ref[idx] << endl; // Compile Error -- > ref.operator[](idx) 여기서 operator함수가 const형이 아니기 때문
// 함수 오버로딩 이후, const 참조자를 이용한 연산자 오버로딩 함수가 호출된다.
}
int main()
{
BoundCheckIntArray arr(5);
for (int i = 0;i < 5; i++)
{
arr[i] = (i + 1) * 11;
}
SHowAllData(arr);
return 0;
}
[]연산자 오버로딩 과정에서, SHowAllData함수와 같이 const형태로 매개변수를 가져오는 경우 함수 정의에서 해당 [] 연산자를 사용할 수 없다. (연산자 오버로딩 함수가 const로 정의되어있지 않으므로)
따라서 함수 오버로딩을 이용해 const가 있는 함수, 없는 함수로 나누어 구현한다.)
#include <iostream>
#include <cstdlib>
using namespace std;
class Point {
private:
int x, y;
public:
Point(int xpos = 0, int ypos = 0)
: x(xpos), y(ypos) {}
friend ostream& operator<< (ostream & os, const Point & pos);
};
ostream& operator<<(ostream & os, const Point& pos) {
os << "[ " << pos.x << ", " << pos.y << "] " << endl;
return os;
} // << 연산자 오버로딩
class BoundCheckPointArray {
private:
Point* arr;
int arrlen;
BoundCheckPointArray(const BoundCheckPointArray& arr) {}
BoundCheckPointArray& operator=(const BoundCheckPointArray& arr) {}
public:
BoundCheckPointArray(int len)
:arrlen(len)
{
arr = new Point[len]; // Point 객체로 이루어진 배열 생성
// 모든 멤버가 0으로 초기화(default)
}
Point& operator[] (int idx)
{
if (idx < 0 || idx >= arrlen)
{
cout << "Array index out of bound exception" << endl;
exit(1);
}
return arr[idx];
}
// 참조형을 반환하지 않고, const 형태로 반환한다 .
Point operator[] (int idx)const
{
if (idx < 0 || idx >= arrlen)
{
cout << "Array index out of bound exception" << endl;
exit(1);
}
return arr[idx];
}
int GetArrLen() const { return arrlen; }
~BoundCheckPointArray() { delete[] arr; }
};
int main()
{
BoundCheckPointArray arr(3);
arr[0] = Point(3, 4); // Point(3,4)의 객체를 배열에 대입
arr[1] = Point(5, 6);
arr[2] = Point(7, 8);
for (int i = 0; i < arr.GetArrLen(); i++)
{
cout << arr[i];
}
return 0;
}
배열 요소의 초기화 과정에서 디폴트 대입 연산자가 호출 -> 멤버 대 멤버 복사가 진행된다.
#include <iostream>
#include <cstdlib>
using namespace std;
class Point {
private:
int x, y;
public:
Point(int xpos = 0, int ypos = 0)
: x(xpos), y(ypos) {}
friend ostream& operator<< (ostream& os, const Point& pos);
};
ostream& operator<<(ostream& os, const Point& pos) {
os << "[ " << pos.x << ", " << pos.y << "] " << endl;
return os;
} // << 연산자 오버로딩
typedef Point* POINT_PTR;
class BoundCheckPointPtrArray {
private:
POINT_PTR * arr; // 포인터 변수의 포인터(주솟값)을 ARR 변수로 지정
int arrlen;
BoundCheckPointPtrArray(const BoundCheckPointPtrArray& arr) {}
BoundCheckPointPtrArray& operator=(const BoundCheckPointPtrArray& arr) {}
public:
BoundCheckPointPtrArray(int len) :arrlen(len)
{
arr = new POINT_PTR[len]; // Point * 자료형객체로 이루어진 배열 생성
// 모든 멤버가 0으로 초기화(default)
}
POINT_PTR& operator[] (int idx)
{
if (idx < 0 || idx >= arrlen)
{
cout << "Array index out of bound exception" << endl;
exit(1);
}
return arr[idx];
}
// 참조형을 반환하지 않고, const 형태로 반환한다 .
POINT_PTR operator[] (int idx) const
{
if (idx < 0 || idx >= arrlen)
{
cout << "Array index out of bound exception" << endl;
exit(1);
}
return arr[idx];
}
int GetArrLen() const { return arrlen; }
~BoundCheckPointPtrArray() { delete[] arr; }
};
int main()
{
BoundCheckPointPtrArray arr(3);
arr[0] = new Point(3, 4); // Point(3,4)의 객체의 주소를 배열에 대입
arr[1] = new Point(5, 6);
arr[2] = new Point(7, 8);
for (int i = 0; i < arr.GetArrLen(); i++)
{
cout << *(arr[i]);
}
delete arr[0];
delete arr[1];
delete arr[2];
return 0;
}
new Point를 대입하면 객체의 주소가 반환되고, 이를 POINT_PTR 자료형 변수에 대입하여 배열을 생성하였다.
끝 :- )
'Langauge > C++' 카테고리의 다른 글
[C++] 우선순위 큐 (priority_queue) STL 사용법, 구현, 정렬 (0) | 2023.06.19 |
---|---|
[C++] 비트마스크 (bitmask) 의 구현, 다양한 예제 (0) | 2023.06.19 |
[열혈 C++] 연산자 오버로딩1 내용 요약 및 예제 풀이 (0) | 2021.05.04 |
Constructor and Separating Files (0) | 2021.03.18 |
Introduction to classes and objects #1 (0) | 2021.03.10 |