Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 4. Как сделать так, чтобы вас уважали и ценили?
Как сделать лучше себе и другим людям
Как сделать свидание интересным?
Категории:
АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника
|
Перегрузка операции вызова функции
Класс, в котором определена операция вызова функции, называется функциональным. От такого класса не требуется наличия других полей и методов: class if_greater{ public: 1nt operator О (1nt a. int b) const { return a > b: } }: Использование такого класса имеет весьма специфический синтаксис. Рассмотрим пример: if_greater х: cout «х(1. 5) «endl; // Результат - О cout «1f__greater()(5. 1) «endl; // Результат - 1 Поскольку в классе if_greater определена операция вызова функции с двумя параметрами, выражение х(1, 5) является допустимым (то же самое можно записать в виде X.operator О (1. 5)). Как видно из примера, объект функционального класса используется так, как если бы он был функцией. Во втором операторе вывода выражение 1f_greater() используется для вызова конструктора по умолчанию класса if_greater. Результатом выполнения этого выражения является объект класса 1f_greater. Далее, как и в предыдущем случае, для этого объекта вызывается функция с двумя аргументами, записанными в круглых скобках. Операцию () можно определять только как метод класса. Можно определить перегруженные операции вызова функции с различным количеством аргументов. Функциональные объекты широко применяются в стандартной библиотеке C++. Перегрузка операции индексирования Операция индексирования [ ] обычно перегружается, когда тип класса представляет множество значений, для которого индексирование имеет смысл. Операция индексирования должна возвращать ссылку на элемент, содержащийся в множестве. Покажем это на примере класса Vect, предназначенного для хранения массива целых чисел и безопасной работы с ним: #1nclucle <iostream.h> #1nclude <stdlib.h> class Vect{ public: explicit Vect(int n = 10): VectCconst int a[]. int n): //инициализация массивом -VectO { 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 intCsize]: for (int i = 0: i < size: i++) p[i] = a[i]: } // Перегрузка операции индексирования: int& Vect::operator [] (int i){ if(i < 0 II i >= size){ cout «"Неверный индекс (i = " «i «")" «endl: cout «"Завершение программы" «endl: exit(O): } return p[i]: } void Vect::Print(){ for (int i = 0: i < size; i++) cout «p[i] «" "; cout «endl: } int ma1n(){ int агг[10] = {1. 2. 3. 4. 5. 6. 7. 8. 9. 10}; Vect а(агг, 10); a.PrintO; cout «a[5] «end!; cout «a[12] «endl; return 0; } Результат работы программы: 1 2 3 4 5 6 7 8 9 10 Неверный индекс (1 = 12) Завершение программы Перегруженная операция индексирования получает целый аргумент и проверяет, лежит ли его значение в пределах диапазона массива. Если да, то возвращается адрес элемента, что соответствует семантике стандартной операции индексирования. В данном примере конструктор с параметром по умолчанию объявлен как explicit для того, чтобы он не являлся конструктором преобразования типа, вызываемым неявно. Ключевое слово explicit указывает на то, что этот конструктор будет вызываться только явным образом. Операцию [] можно определять только как метод класса.
Date: 2016-07-25; view: 477; Нарушение авторских прав |