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