1 2 3 4 5 6 7 8 9 10 11 12 13 |
//Листинг #1 Перегрузка операции [] class MyInt { int *x; public: int& operator[](const int index) { return x[index]; }; }; int main() { MyInt i; i[0]; i[1]; i[100]; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
//Листинг #2 Используем объект класса как одномерный массив Перегрузка [] #include <iostream> using std::cout; class MyArr { unsigned m_size; //количество ячеек int *arr; //указательная переменная в качестве массива public: int& operator[](const int index) { return arr[index]; }; explicit MyArr(const unsigned size = 0); //прототип конструктора с параметром, для задания количества ячеек arr ~MyArr(); //прототип деструктора unsigned size() const { return m_size; } //функция для вытаскивания количества ячеек arr }; MyArr::~MyArr() { delete[]arr; } MyArr::MyArr(const unsigned size):m_size(size) { if (!size) arr = new int[1]; else arr = new int[size]; } int main() { MyArr arr(10); unsigned temp = 0; for (unsigned i = 0; i < arr.size(); i++) { arr[i] = temp++; //заполняем массив по порядку } for (unsigned i = 0; i < arr.size(); i++) { cout << arr[i] << ' '; //выводим массив } std::cin.get(); } |
1 2 3 4 |
int main() { const MyArr a(10); a[0]; //ошибка } |
1 2 |
int& operator[](const int index) { return arr[index]; }; //наша текущая перегрузка const int& operator[](const int index) const { return arr[index]; }; //дополнительная перегрузка для элементов константного объекта |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
//Листинг #3 Перегрузка [][] Используем объект класса как двумерный массив Visual Studio 2015 #include <iostream> using std::cout; using std::cin; class MyArr { unsigned m_row; //количество строк unsigned m_col; //количество колонок int **arr; //указательная переменная в качестве массива MyArr() {} public: MyArr(const unsigned, const unsigned); //прототип конструктора с параметрами, для количеств на массив ~MyArr(); //прототип деструктора unsigned row() const { return m_row; } //функция для вытаскивания числа строк unsigned col() const { return m_col; } //функция для вытаскивания числа строк int* operator[](const int i) { return arr[i]; } const int* operator[](const int i) const { return arr[i]; } }; MyArr::MyArr(const unsigned row_, const unsigned col_):m_row(row_),m_col(col_) { arr = new int * [m_row]; //создаём двумерный массив for (unsigned i = 0; i < m_row; i++) { arr[i] = new int[m_col]; } } MyArr:: ~MyArr() { /*зачищаем двумерный массив*/ for (unsigned i = 0; i < m_row; i++) { delete[]arr[i]; } delete[]arr; } int main() { MyArr arr(10, 6); unsigned count = 0; //для заполнения по порядку for (unsigned i = 0; i < arr.row(); i++) { for (unsigned j = 0; j < arr.col(); j++) { arr[i][j] = count++; } } for (unsigned i = 0; i < arr.row(); i++) { for (unsigned j = 0; j < arr.col(); j++) { cout << arr[i][j] << '\t'; } cout << "\n"; } const MyArr arr2(10, 6); //arr[0][0] = 100 // для константого объекта нельзя cin.get(); } |
Добавить комментарий