Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
###Cpp_лкц1_1.09_11_#дляБАК#29_01_12.doc
Скачиваний:
67
Добавлен:
29.04.2019
Размер:
6.42 Mб
Скачать

Часть II. Объектно-ориентированное программирование

Операцию ( ) можно определять только как метод класса. Можно определить перегруженные операции вызова функции с различным количеством аргументов. Функциональные объекты широко применяются в стандартной библиотеке C++.

Перегрузка операции индексирования

Операция индексирования [ ] обычно перегружается, когда тип класса представляет множество значений, для которого индексирование имеет смысл. Операция индексирования должна возвращать ссылку на элемент, содержащийся в множестве. Покажем это на примере клаеса Vect, предназначенного для хранения массива целых чисел и безопасной работы с ним:

#include <iostream.h> #include <stdlib.h> class Vect{ public:

explicit Vect(int n = 10);

Vect(const int a[]. int n); //инициализация массивом

-VectО { delete [] p: }

int& operator [] (int i):

void PrintO:

private: int* p: int size:

}:

Vect::Vect(int n) : size(n){ p = new int[size];

}

Vect::Vect(const int a[]. int n) : size(n){

p = new int[size];

for (int i = 0: i < size: i++) p[i] = a[i]:

}

// Перегрузка операции индексирования: int& Vect::operator [] (int i){ if(i < 0 || i >= size){

cout « "Неверный индекс (i = " « i « ")" « endl:

cout « "Завершение программы" « endl:

exit(0):

} •

return p[i];

}

void Vect::Print(){

for (int i - 0: i < size; i++) cout « p[i] « " ";

cout « endl: }

Глава 4. Классы

197

int main(){

int агг[10] = {1. 2. 3. 4. 5. 6, 7, 8. 9. 10};

Vect a(arr, 10);

a.PrintO;

cout « а[5] « endl;

cout « а[12] « endl:

return 0; } Результат работы программы:

123456789 10

6

Неверный индекс (i - 12)

Завершение программы

Перегруженная операция индексирования получает целый аргумент и проверяет, лежит ли его значение в пределах диапазона массива. Если да, то возвращается адрес элемента, что соответствует семантике стандартной операции индексирования.

В данном примере конструктор с параметром по умолчанию объявлен как explicit для того, чтобы он не являлся конструктором преобразования типа (см. с. 185), вызываемым неявно. Ключевое слово explicit указывает на то, что этот конструктор будет вызываться только явным образом.

Операцию [] можно определять только как метод класса.

Указатели на элементы классов

К элементам классов можно обращаться с помощью указателей. Для этого определены операции .* и ->*. Указатели на поля и методы класса определяются по-разному.

Формат указателя на метод класса:

возвр_тип (имя_класса::*имя_указателя)(параметры);

Например, описание указателя на методы класса monstr

int getJiealthO {return health;}

int get_ammo() {return ammo;} (а также на другие методы этого класса с такой же сигнатурой) будет иметь вид:

int (monstr;; *pget)(): Такой указатель можно задавать в качестве параметра функции. Это дает возможность передавать в функцию имя метода:

void fun(int (monstr:: *pget)()){

(*this.*pget)(): // Вызов функции через операцию .*

(this->*pget)(): // Вызов функции через операцию ->*

} Можно настроить указатель на конкретный метод с помощью операции взятия адреса:

198