Использование классов при работе с векторами и матрицами (Лабораторная работа № 2), страница 4

3. Переопределение операций

Классы позволяют определить любые операции с объектами, в том числе и переопределить существующие в языке для других типов данных с тем, чтобы они выполнялись с объектами классов. Действительно, удобнее записывать сложение векторов X и Y как

Z = X + Y;  , чем Z = AddVec(X,Y); .

В описании класса операции сложения, вычитания и скалярного умножения векторов определяются, как показано на листинге 6.

Листинг 6

#include "define.h"

class TVector

  {

private:  // закрытый раздел

// данные класса

     int n;

     Vector V;

public:  // открытый раздел

// методы класса

voidInpVec(int);

void OutVec(int, int, int);

     void SetVec(int,  Vector);

     void GetVec(int&, Vector);

// операторыкласса

     TVector operator + (TVector);

     TVector operator - (TVector);

     double  operator * (TVector);

};

Заголовок метода-операции начинается с описания типа возвращаемого значения, затем следует служебное слово operator, а далее – идентификатор (символ) операции. В данном примере идентификаторами служат символы соответствующих операций со скалярными данными, хотя могут использоваться любые другие комбинации символов, букв и цифр. В скобках указывается тип параметра – второго операнда. Первым операндом подразумевается объект этого же класса. Более ясно это становится из текста файла реализации, соответствующий фрагмент которого приведен на листинге 7.

Листинг 7

// файл реализации класса TVector

...

TVector TVector::operator + (TVector Y)

// оператор для сложения двух векторов

{

// описание данных

     int i;

     TVector R;

// сложение

     if (n==Y.n)  // векторы одинаковой длины

{

       R.n=n;

       for (i=1; i<=R.n; i++)

   R.V[i]=V[i]+Y.V[i];

       }

     else           // векторы разной длины

{

       R.n=1;

       R.V[1]=0;

       }

     return R;

}

TVector TVector::operator - (TVector Y)

// оператор для вычитания двух векторов

{

// описание данных

     int i;

     TVector R;

// вычитание

     if (n==Y.n)  // векторы одинаковой длины

{

       R.n=n;

       for (i=1; i<=R.n; i++)

   R.V[i]=V[i]-Y.V[i];

       }

     else           // векторы разной длины

{

       R.n=1;

       R.V[1]=0;

       }

     return R;

}

double TVector::operator * (TVector Y)

// оператор для вычисления скалярного произведения двух векторов

{

// описаниеданных

     int i;

     double S;

// умножение

     if (n==Y.n)  // векторы одинаковой длины

{

       S=0;

       for (i=1; i<=n; i++)

S+=V[i]*Y.V[i];

}

     else           // векторы разной длины

       S=0;

     return S;

}

В качестве вектора-результата в двух первых методах используется внутренний вектор R, который в конце возвращается оператором return. Следует обратить внимание на идентификацию операндов. Первый операнд идентифицируется простым именем (n, V[i]), а второй – сложным (Y.n, Y.V[i]). А в остальном функции-операторы практически повторяют функции AddVec(), SubVec() и MultVec().

Главная функция для иллюстрации работы переопределенных операций приведена на листинге 8 и практически совпадает с приведенной на листинге 4; различие заключается только в записи операций.

Листинг 8

#include <iostream.h>

#include <stdio.h>

#include <conio.h>

#include "tvector.h"

void main()

{

// описание данных

     TVector X,Y,Z;

     double S;

// задание вектора X

clrscr();

cout<<endl<<"Вводим вектор X"<<endl<<endl;

     X.InpVec(0);

// задание вектора Y

cout<<endl<<"Вводим вектор Y"<<endl<<endl;