Имя_класса::operator#(список_аргум)




Тема. Разработка классов

 

Теоретическое введение. При разработке класса необходимо определить данные класса и его методы, конструкторы и деструкторы.

 

Конструктор – это функция-член класса, которая вызывается автоматически при создании статического или динамического объекта класса. Он инициализирует объект и переменные класса. У конструктора нет возвращаемого значения, но он может иметь аргументы и быть перегружаемым.

 

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

Деструктор имеет то же имя, что и класс, но перед ним стоит ‘~’.

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

Операторы-функции. Используются для введения операций над объектами, связываемых с символами:

+, -, *, /, %, ^, &, |, ~,!, =, <, >,+=, [], ->, (), new, delete.

Оператор-функция является членом класса или дружественной (friend) классу. Общая форма оператор-функции-члена класса:

Возвращаемый_тип

имя_класса::operator#(список_аргум)

{/*тело функции*/}

После этого вместо operator#(a,b) можно писать a#b. Здесь # представляет один из введенных выше символов. Примерами являются операторы >> и << – перегружаемые операторы ввода-вывода. Отметим, что при перегрузке нельзя менять приоритет операторов и число операндов. Если оператор-функция-член класса перегружает бинарный оператор, то у функции будет только один параметр-объект, стоящий справа от знака оператора. Объект слева вызывает оператор-функцию и передается неявно с помощью указателя this. В дружественную функцию указатель this не передается, поэтому унарный оператор имеет один параметр, а бинарный – два.

Оператор присваивания не может быть дружественной функцией, а только членом класса.

 

Пример. Создается класс Polynom. В головной программе выполняется тестирование класса.

 

#include <iostream.h>

#include <conio.h>

#include <math.h>

 

class Polynom {

int n;

double *koef;

public:

Polynom(); //конструкторы

Polynom(int k);

Polynom(int k,double *mas);

Polynom(const Polynom&ob); //конструктор копирования

~Polynom(){delete[]koef;}

void GiveMemory(int k);

void SetPolynom(int k,double *mas);

void SetDegree(int k){n=k;}; //установить степень

void CalculateValue(double x); //вычислить значение

int GetDegree(){return n;}; //получить степень

double GetOneCoefficient(int i){return(koef[i]);};

Polynom operator+(Polynom ob); //перегрузка операторов

Polynom operator*(Polynom ob);

double& operator[](int i){return(koef[i]);} //перегрузка []

 

Polynom& operator = (const Polynom p) {

if(&p==this) return *this;

if(koef) delete [] koef;

n=p.n;

koef=new double [p.n+1];

for(int i=0;i<=p.n;i++)

koef[i]=p.koef[i];

return *this;

}

 

friend ostream& operator<<(ostream& mystream,Polynom &ob);

friend istream& operator>>(istream& mystream,Polynom &ob);

int min(int n,int m) {return (n<m)? n:m; }

int max(int n,int m) {return (n>m)? n:m; }

};

 

//*********** Polynom() **********************************

 

Polynom::Polynom()

{

randomize();

n=random(5);

koef=new double[n+1];

if(!koef){cout<<"Error";getch();return;}

for(int i=n;i>=0;i--)

koef[i]=random(10)-5;

}

 

//************* Polynom(int k) *******************************

 

Polynom::Polynom(int k)

{

n=k;

koef=new double[n+1];

if(!koef){cout<<"Error";getch();return;}

for(int i=n;i>=0;i--)

koef[i]=random(10)-5;

}

 

//****************** Polynom(int k,double mas[]) ******************

 

Polynom::Polynom(int k,double mas[])

{

n=k;

koef=new double[n+1];

if(!koef){cout<<"Error";getch();return;}

for(int i=n;i>=0;i--)

koef[i]=mas[i];

}

 

//*************** Polynom(const Polynom&ob) *********************

 

Polynom::Polynom(const Polynom&ob)

{

n=ob.n;

koef=new double[n+1];

if(!koef){cout<<"Error";getch();return;}

for(int i=0;i<=n;i++)

koef[i]=ob.koef[i];

}

 

//**************** void GiveMemory(int k) **********************

 

void Polynom::GiveMemory(int k)

{

if(koef) delete [] koef;

koef=new double[k+1];

if(!koef){cout<<"Error";getch();return;}

}

 

//******************** SetPolynom **************************

 

void Polynom::SetPolynom(int k,double *mas)

{

n=k;

if(koef) delete [] koef;

koef = new double [n+1];

for(int i=n;i>=0;i--)

koef[i]=mas[i];

}

 

//*************** CalculateValue *****************************

 

void Polynom::CalculateValue(double x=1.0)

{

double s;

int i;

for(s=koef[0],i=1;i<=n;i++)

s=s+koef[i]*pow(x,i);

cout<<"f("<<x<<")="; cout<<s<<endl;

}

 

//**************** Polynom operator+(Polynom ob) ***************

 

Polynom Polynom::operator+(Polynom ob)

{

int i;

Polynom rab;

rab.GiveMemory(max(n,ob.GetDegree()));

for(i=0;i<=min(n,ob.GetDegree());i++)

rab.koef[i]=koef[i]+ob.GetOneCoefficient(i);

if(n<ob.GetDegree())

{

for(i=min(n,ob.GetDegree())+1;i<=ob.GetDegree();i++)

rab.koef[i]=ob.GetOneCoefficient(i);

rab.n=ob.GetDegree();

}

else

{

for(i=min(n,ob.GetDegree())+1;i<=n;i++) rab.koef[i]=koef[i];

rab.n=n;

}

return rab;

}

 

//*************** Polynom operator*(Polynom ob) ***************

 

Polynom Polynom::operator*(Polynom ob)

{

int i,j,k;

double s;

Polynom rab;

rab.GiveMemory(n+ob.GetDegree());

for(i=0;i<=n+ob.GetDegree();i++)

{

s=0;

for(j=0;j<=n;j++)

for(k=0;k<=ob.GetDegree();k++)

if(j+k==i)s=s+koef[j]*ob.GetOneCoefficient(k);

rab.koef[i]=s;

}

rab.n=n+ob.GetDegree();

return rab;

}

 

//********** ostream& operator<<(ostream& mystream,Polynom &ob) ******

 

ostream& operator<<(ostream& mystream,Polynom &ob)

{

char c=' '; //пропустим “+” перед первым коэффициентом

for(int i=ob.n;i>=0;i--)

{

double ai=ob.koef[i];

if(ai==0) continue;

else {if(ai>0) mystream<<c; mystream<<ai;}

if(i==0) continue; else mystream<<"x";

if(i==1) continue; else mystream<<"^"<<i;

if(ai!=0)c='+';

}

if(c==' ')mystream<<0;

mystream<<endl;

return mystream;

}

 

//********* istream& operator>>(istream& mystream,Polynom &ob) *

 

istream& operator>>(istream& mystream,Polynom &ob)

{

int i;

cout<<"Enter Degree:"; mystream>>ob.n; cout<<endl;

for(i=ob.n;i>=0;i--)

{

cout<<"Enter koeff "<<i<<":"; mystream>>ob.koef[i];

}

return mystream;

}

 

//******************** MAIN ****************************

 

int main(int argc, char* argv[])

{

const int m=3;

Polynom f,g,masp[m],*p1,s;

int n=5,i;

double K[6]={1.0,3.2,0.0,4.1,0.0,1.1};

p1=new Polynom(n,K);

cout<<*p1;

p1->CalculateValue(2.0);

cin>>f;

cout<<" f(x)= "; cout<<f;

cout<<" g(x)= "; cout<<g;

s=f+g;

cout<<"f(x)+g(x) = "; cout<<s;

s=f*g;

cout<<" f(x)*g(x) = "; cout<<s;

s=masp[0]; cout<<masp[0];

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

{

s=s+masp[i]; cout<<masp[i];

}

cout<<"Summa: "; cout<< s;

while(!kbhit());

delete p1;

return 0;

}

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-04-27 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: