Классы позволяют определить любые операции с объектами, в том числе и переопределить существующие в языке для других типов данных с тем, чтобы они выполнялись с объектами классов. Действительно, удобнее записывать сложение векторов 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;
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.