|
Программирование >> Программирование на языке c++
превышают максимально допустимое длинное целое число) и на экран выводятся сообщения об ошибках. Приведенная программа выполнялась только на персональных компьютерах. 5.7. Функция operatorO Оператор () представляется в следующей форме; операнд 1 { операнд 2 ) Соответствующая функция operator() может быть определена как нестатическая компонент-функция класса А, а также любого производного от этого класса. Обращение к ней будет осуществляться в следующей форме: oA(list), где первый операнд оА - это объект класса А, в котором описана функция operator, второй операнд (list) - это список (возможно, пустой) аргументов. Этот список передается функции operator как аргумент. Выражение oA(list) интерпретируется как oA.operator()(list) = oA.operator()(<argl,arg2,...>), где угловые скобки говорят о том, что список аргументов может быть и пустым. Вызов любой функции в языке C-i-i- можно записать в виде: имя (список параметров); Рассмотрим бинарную операцию, операндами которой являются: имя - левый операнд и список параметров - правый операнд. В результате оператор вызова функции можно доопределить, как и любой другой оператор. Это оказывается полезным при объявлении класса с единственным компонентом-функцией или с несколькими компонентами-функциями, среди которых один компонент очень важен (например, используется значительно чаще, чем все остальные). Рассмотрим примеры программ, в которых используется функция operatorO. #include <iostream.h> class аггау2 { int **array; int X,Y; public: array2(int,int); это конструктор ~аггау2(); это деструктор int operator()(int,int); функция operator() int operator()(int); функция operator() array2::array2(int x,int y) : X{x), Y(y) { array=new int*[x]; for(int i=0;i<x;i++) array[i]=new int[y]; for(i=0;i<x;i++) for(int j=0;j<y;j++) array[i][j]=i*j; } array2::~ array 2() { for{int i=0;i<X;i++) delete[] array[i]; deiete[] array; } int array2::operator()(int x.int y) { if ((x>=X)(y>=Y)) { cerr range error\n ; x=0; y=0;} return array[x][y]; } int array2::operator()(int x) { if (x>=X*Y) { cerr range error\n ; x=0; } return array[x/Y][x%Y]; } void main(void) { array2 a2(6,7); cout a2(4,5) endl; cout a2(17) endl; } В этой программе объявляется класс аггау2. Конструктор класса динамически выделяет память для двухмерного массива. Обращение к этому массиву осуществляется через указатель array с атрибутом private. Деструктор класса разрушает массив при завершении функции main. В классе аггау2 объявлены две функции operatorQ, которые далее позволяют обращаться к построенному массиву и как к двухмерному, и как к одномерному. В результате можно читать значение любого элемента построенного массива. В функции main объявлен объект класса аггау2: аггау2 а2(6,7);. Теперь мы можем получить значение любого элемента массива, обратившись к нему либо как к двухмерному массиву, либо как к одномерному, например: а2(4,5) или а2(17). Результаты выполнения этой программы представятся в виде (массив был предварительно инициализирован некоторыми значениями в конструкторе): 20 6 Второй пример показывает использование функции operatorO с пустым списком аргументов (второй операнд имеет значение void). #include <iostream.h> class A { базовый класс static n; public: A() { n++; } void operatorOO { cout n objects\n ; } }; class В : public A {}; производный класс int A::n=0; инициализация статической переменной void main(void) { A a1,a2,a3,a4; объявление 4 объектов класса A аЗ(); Результат: 4 objects А а5,а6; объявление 2 объектов класса А а6(); Результат: 6 objects В Ь1,Ь2; объявление 2 объектов класса В и 2 подобъектов класса А Ь2(); Результат: 8 objects Третья программа демонстрирует использование виртуальной функции operator() для независимого подсчета сконструированных объектов базового класса А и производного класса В. #include <iostream.h> class А { базовый класс static п; public: АО { П++; } конструктор базового класса
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.003
При копировании материалов приветствуются ссылки. |