Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект лекций по курсу 'Информатика'.doc
Скачиваний:
4
Добавлен:
14.07.2019
Размер:
483.84 Кб
Скачать

Int n, k ; // ее размерности

public : // методы

cmatr (int n , int k) // конструктор

{ распределение памяти на матрицу} ;

cmatr (float **m, int n, int k) // конструктор

{ распределение памяти и инициализация матрицы } ;

~cmatr() // деструктор

{ очистка памяти } ;

float det ( void ) // вычисление определителя

{ тело функциии, реализующей вычисление определителя } ;

cmatr operator = (cmatr &x) // функция оператор присваивания матриц

{ тело функциии, реализующей присваивание матриц } ;

cmatr operator + (cmatr &x) // функция оператор сложения матриц

{ тело функциии, реализующей сложение матриц } ;

Void print ( void ) // печать матрицы

{ тело функциии, реализующей печать матрицы } ;

}

Теперь рассмотрим, как работать с классом.

main ()

{ float x[5][3]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15} ,

y[5][3]={15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1} ;

cmatr A(x, 5, 3), B(y, 5, 3), C(5, 3), D(x, 3, 3) ; // оператор описания объектов типа cmatr

C=A+B ; // сложение матриц

C.print() ; // печать матрицы С

сout << “определитель матрицы=” << D.det() ; //вычисление и печать определителя матицы D

~cmatr() ;

}

Создание классов нужно для того, чтобы любой пользователь, не имея никакого представления о том, что делают методы класса, мог создавать его объекты и работать с ними.

Определение методов вне класса.

Рассмотрим класс, приведенный в предыдущем примере, если заполнить тела его методов соответствующими алгоритмами, то определение класса станет огромным и не обозримым, поэтому часто внутри класса даются декларации методов, а сами методы определяются позже.

class cmatr {

float **m ;

int n, k ;

public : // декларации методов

cmatr( int , int ) ;

cmatr( float **, int , int ) ;

~cmatr() ;

float det(void) ;

cmatr operator = ( cmatr &) ;

cmatr operator + ( cmatr &) ;

void print (void) ;

}

Далее в любом месте программы – до main() или после, но внутри одного программного блока, пойдут определения методов класса со следующими специальными заголовками методов класса, включающими имя класса и оператор глобального разрешения ::.

Тип результата имя класса::имя_метода_класса( параметры)

{ тело метода }

Например:

сmatr::cmatr ( int n, int k)

{ распределение памяти }

float cmatr::det( void)

{ вычисление определителя}

Частные и общие данные.

private – частные данные,

public – общие.

Методы всегда общие, т.к. они должны быть доступны всем, а вот объекты могут быть и общие и частные. По умолчанию всегда берется – private, пока его не изменят на public явно.

Вернемся к программе с классом cmatr, данные в ней – private, а методы - public. Нигде внутри main() мы не можем изменить значения объектов m, n, k, не можем присвоить им что-либо или достать их. Все наши действия только через методы (функции). Таким образом, работает принцип инкапсуляции – сокрытия информации. Класс для пользователя – «черный ящик», он не может изменять данные, не знает, как работают методы, он только представляет какой будет результат.

Программа предоставляет пользователю минимальную информацию.

Если бы объекты класса cmatr были описаны так, как это сделано ниже, то можно было бы обойтись без конструктора и в любой момент достать любой из объектов класса.

class cmatr {

public: float **m ;

int n, k ;

}

main()

{

cmatr A ;

A.m[1][1]=1 ;

A.n=5 ;

A.k=3 ;

}

Для обращения к общим данным используется оператор «точка».

В этом случае информация стала доступной из вне, и в любом месте программы можно как угодно изменять объекты класса. Практически мы пришли к работе со структурой struct. Нет смысла строить сложную закрытую структуру класса, если все можно сделать из main(). Иногда часть объектов делают общими часть частными.

Для снижения количества ошибок при работе с классами возьмите себе за правило ограничивать доступ к данным класса, определяя элементы класса как private. В этом случае класс должен задавать интерфейсные функции, с помощью которых программа может присваивать начальные значения частным элементам класса. Такую функцию выполняет конструктор. И по мере необходимости корректировать значения объектов класса – другие методы.