Программирование >>  Программирование на языке c++ 

1 ... 66 67 68 [ 69 ] 70 71 72 ... 159


превышают максимально допустимое длинное целое число) и на экран выводятся сообщения об ошибках. Приведенная программа выполнялась только на персональных компьютерах.

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:

АО { П++; } конструктор базового класса



1 ... 66 67 68 [ 69 ] 70 71 72 ... 159

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.003
При копировании материалов приветствуются ссылки.
Яндекс.Метрика