Тема. Разработка классов
Теоретическое введение. При разработке класса необходимо определить данные класса и его методы, конструкторы и деструкторы.
Конструктор – это функция-член класса, которая вызывается автоматически при создании статического или динамического объекта класса. Он инициализирует объект и переменные класса. У конструктора нет возвращаемого значения, но он может иметь аргументы и быть перегружаемым.
Противоположные конструктору действия выполняет деструктор, который вызывается автоматически при уничтожении объекта.
Деструктор имеет то же имя, что и класс, но перед ним стоит ‘~’.
Деструктор можно вызывать явно в отличие от конструктора. Конструкторы и деструкторы не наследуются, хотя производный класс может вызывать конструктор базового класса.
Операторы-функции. Используются для введения операций над объектами, связываемых с символами:
+, -, *, /, %, ^, &, |, ~,!, =, <, >,+=, [], ->, (), 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;
}