mình học C++,có làm bài xd class đa thức,đây là nguyên bài của mình:
mình mới xd sơ nên còn thiếu nhìu cái^^
Code:
    #include<iostream.h>
    class DATHUC
    {
            private:
            double*p;
            int*q;
            int n;
            public:
           
            friend istream& operator>>(istream& is,DATHUC &s);
            friend ostream& operator<<(ostream& os,const DATHUC &s);
            void rutgon();
            friend DATHUC operator+(DATHUC &a,DATHUC &b);
            DATHUC operator-();
            DATHUC operator-(DATHUC a);
            DATHUC operator*(DATHUC a);
            DATHUC operator=(DATHUC a);
           
            DATHUC()
            {
                    this->n=0;this->p=NULL;this->q=NULL;
            }
           
            DATHUC(int n1)
            {
                    this->n=n1;this->p=new double[n1];this->q=new int[n1];
            }
            DATHUC(const DATHUC&dt);
            ~DATHUC();
    };
     
    DATHUC operator+(DATHUC &a,DATHUC &b)
    {
            int t=a.n+b.n,k=0;
            DATHUC h(t);
            for(int i=0;i<a.n;i++)
            {      
                    h.p[i]=a.p[i];
                    h.q[i]=a.q[i];
            }
            for(int j=a.n;j<t;j++,k++)
            {
                    h.p[j]=b.p[k];
                    h.q[j]=b.q[k];
            }
            h.rutgon();
            return h;
    }
     
    DATHUC::~DATHUC()
    {
            n=0;
            delete []p;
            delete []q;
            cout<<"huy\n";
    }
     
    DATHUC::DATHUC(const DATHUC&dt)
    {
            this->n=dt.n;
            this->p=new double[n];
            this->q=new int[n];
            for(int i=0;i<dt.n;i++){
                    this->p[i]=dt.p[i];
                    this->q[i]=dt.q[i];
            }
    }
    // vấn đề là ở đây ạ!
    void DATHUC::rutgon()
    {
            int i,j;
            for(i=0;i<this->n-1;i++)
            {
                    if(this->p[i]==0&&this->q[i]==0){
                            if(this->p[j]==0&&this->q[j]==0)
                            j++;
                            else
                            i++;
                    }
                    for(j=i+1;j<this->n;j++)
                            {      
                                    if(this->q[i]==this->q[j]){
                                    this->p[i]=this->p[i]+this->p[j];
                                    this->p[j]=0;this->q[j]=0;
                            }
                            }
            }
    }
     
    istream& operator>>(istream& is,DATHUC &s)
    {
            if(s.p!=NULL) delete s.p;
            if(s.q!=NULL) delete s.q;
            cout<<"Nhap so cac he so:";
            cin>>s.n;
            s.p=new double[s.n];
            s.q=new int[s.n];
            for(int i=0;i<s.n;++i)
            {
                    cout<<"He so: "<<i<<"=\n";
                    is>>s.p[i];
                    cout<<"Nhap bac: ";
                    is>>s.q[i];
            }
            return is;
    }
     
    ostream& operator<<(ostream& os,const DATHUC &s)
    {
            int k=0,d2=0;
            cout<<"KQ:\n";
            for(int i=0;i<s.n;i++)
            {
                    if(s.p[i]!=0||s.q[i]!=0){
                    if(s.p[i]==1)
                    {
                            if(s.q[i]!=0&&s.q[i]!=1){
                                    os<<"x"<<"^"<<s.q[i];  
                            }
                            else if(s.q[i]==1){
                                    os<<"x";
                            }
                            else os<<"1";
                            if(i!=s.n-1)
                                    os<<"+";
                                    continue;
                    }
                    if(s.q[i]==0)
                    {
                            if(i!=s.n-1){
                                    int d=0;
                                    for(int h=i+1;h<s.n;h++)
                                    {
                                            if(s.q[h]==0&&s.p[h]==0)
                                            d++;
                                    }
                                    if(d==(s.n-i-1)){
                                            os<<s.p[i];
                                            d=0;
                                            continue;      
                                    }
                                    else{
                                            os<<s.p[i]<<"+";
                                            continue;
                                    }
                            }
                            else{
                                    os<<s.p[i];
                                    continue;      
                            }
                    }
                    if(s.p[i]==0){
                            continue;
                    }
                    if(s.q[i]==1){
                            os<<s.p[i]<<"x";
                    }
                    else os<<s.p[i]<<"x"<<"^"<<s.q[i];
                    if(i!=s.n-1){
                            k=i+1;
                            while(k<s.n){
                                    if(s.p[k]==0)
                                    d2++;k++;
                            }
                            if(d2==(s.n-i-1)){
                                    d2=0;break;
                                    }
                            else
                            d2=0;os<<"+";
                    }
            }
            }
            os<<"\n";
            return os;
    }
     
    int main()
    {
            DATHUC s,h;
            cin>>s;
            cout<<s;
            cin>>h;
            cout<<h;
            cout<<s+h;
            return 0;
    }
vđ là ở hàm rutgon(),ban đầu mình viết hàm như sau:
mình dùng friend:
Code:
DATHUC rutgon(DATHUC h)
{
	int i,j;
	for(i=0;i<h[.]n-1;i++)
	{
		if(h[.]p[i]==0&&h[.]q[i]==0){
			if(h[.]p[j]==0&&h[.]q[j]==0)
			j++;
			else
			i++;
		}
		for(j=i+1;j<h[.]n;j++)
			{	
				if(h[.]q[i]==h[.]q[j]){
				h[.]p[i]=h[.]p[i]+h[.]p[j];
				h[.]p[j]=0;h[.]q[j]=0;
			}
			}
	}
	return h;
}
nhưng khi mình chạy thì hàm hủy lại đc gọi 5 lần,2 lần trước lệnh cout<<s+h,và 3 lần sau lệnh này.nhưng khi mình sửa hàm rutgon() lại(như trong code đầu) thì hàm hủy chỉ đc gọi 3 lần sau lệnh cout<<s+h,mình k hiểu cơ chế hàm hủy đc gọi ở đây là gì?vì sau khi sửa lại,mình xem xét thì chỉ thấy tạo 2 biến tạm(1 trong hàm + và 1 trong rutgon()),thế thì chỉ gọi 2 lần thui chứ?nhưng sao lại gọi 3 lần?mong các bạn giải thích rõ giùm mình ở cả trước và sau khi sửa,tks các bạn!