为什么对象不会使用 new 初始化?

-3 c++

为什么当我调用testPolynomial它显示对象的最后一个值并且不会创建一个初始化为 0 的新对象时?

为什么它仍然在臀部并且在完成第一个函数调用 ( testPolynomial) 函数时不会构造自己?

多项式



#ifndef Header_h
#define Header_h





class Polinomial {

private:
    static int degree;
    static int falsse_degree;
    static double coEfArr[10];
public:
    //----------methods-------//
    static int getMaxDegree(){return degree;}
    static void printIndexDeg(int index){std::cout<<coEfArr[index];};
    int getDegree(bool b){ if (b==true){return degree;}return falsse_degree;}


    void findAndSetRealMaxDegree(){
        int max=0;
        for (int i=0; i<10; i++)
        {
            if (coEfArr[i]!=0)
            {
                max=i;
            }
        }
        degree=max;
    }


    void setCoeff(int index, double coef_d)
    {
        coEfArr[index]=coef_d;
        findAndSetRealMaxDegree();
    };





    static void fillWithZeros(){
        for (int i=0; i<10; i++) {
            coEfArr[i]=0;
        }
    }

    ;
    //------ End of methods-----//
    //------Begining of constructors----//
    Polinomial();
    Polinomial(int deg);
    Polinomial(double arr[],int deg);
    //-------------end of constructors-----------------//
    //------copy constructors-------//
    Polinomial (const Polinomial &p2);
    friend std::ostream& operator<<(std::ostream& os, const Polinomial& p);
     void operator = (const Polinomial &poli_obj )
    {
         fillWithZeros();
         degree=poli_obj.degree;
         falsse_degree=poli_obj.falsse_degree;
         for (int i=0; i<degree; i++)
         {
             coEfArr[i]=poli_obj.coEfArr[i];
         }
    }


    void * operator new(size_t size)
      {
          std::cout<< "Overloading new operator with size: " << size << std::endl;
          void * p = malloc(size);


          return p;
      }

      void operator delete(void * p)
      {
          std::cout<< "Overloading delete operator " << std::endl;
          free(p);
      }


};







////////////


//////////



////////////

//----------------------End of class Polinomial ------------------------//
int Polinomial::degree{0};
int Polinomial::falsse_degree{0};
double Polinomial::coEfArr[]{0};
//constructor
Polinomial::Polinomial()
{

degree=0;

};

Polinomial::Polinomial(int deg)
{
    degree=0;
    falsse_degree=deg;
};

Polinomial::Polinomial(double arr[],int deg)
{
    falsse_degree=deg;
    for (int i=0; i<=deg; i++)
    {
        coEfArr[i]=arr[i];
    }
    findAndSetRealMaxDegree();
}



//copy constructor
Polinomial::Polinomial(const Polinomial &p2){
    falsse_degree=p2.falsse_degree;
    for (int i=0; i<=p2.degree; i++)
    {
        coEfArr[i]=p2.coEfArr[i];
    }
    findAndSetRealMaxDegree();
}

std::ostream& operator<<(std::ostream &os, const Polinomial &p)
{
    os<<"Polinomial=";
    if (p.degree==0 && p.coEfArr[0]==0)
    {
        os<<0;
        return os;

    }
    else

        for (int i=0; i<=p.degree; i++)
            {
                if (i==0) {
                os<<p.coEfArr[i];
            }
                else
            os<<"+"<<p.coEfArr[i]<<"X^"<<i;
        }

    return os;
};

#endif /* Header_h */

Run Code Online (Sandbox Code Playgroud)

理性.h

#include "Polynom.h"
#ifndef rational_h
#define rational_h

class Rational
{
private:
    static Polinomial* nom;
    static Polinomial* de_nom;

public:
 static void getDeNom(){std::cout<<*de_nom<<std::endl;};
 static void getNom(){std::cout<<*nom<<std::endl;};
    Rational();


};

Polinomial* Rational::nom=new Polinomial();
Polinomial* Rational::de_nom=new Polinomial();


Rational::Rational()
{

    de_nom->setCoeff(0, 1.0);
}

#endif /* rational_h */

Run Code Online (Sandbox Code Playgroud)

主程序

#include <iostream>
#include "Polynom.h"
#include "rational.h"
using namespace std;

void testPolynomial();
void testRational();


int main() {
    testPolynomial();
    testRational();

}

void testPolynomial()
{
    cout<<"----- start testPolynomial ---------"<<endl;
    cout<<"test0= "<<Polinomial::getMaxDegree()<<endl;
    Polinomial p1;
    cout<<"test1="<<p1<<endl;
    Polinomial p2(6);
    p2.setCoeff(2, 0.4);
    cout<<"test2= "<<p2<<"degree="<<p2.getDegree(false)<<endl;
    double c[]{0.1,0.2,0,11.5,1.3};
    Polinomial p3(c,4);
    cout<<"test3="<<p3<<endl;
    p2.setCoeff(2, 0.0);
    cout<<"test4= "<<p2<<endl;
    cout<<"test6 MaxDegree= "<<Polinomial::getMaxDegree()<<endl;
    cout<<"___________"<<endl;

}


void testRational()
{
    cout<<"-----begind rational test-----"<<endl;
    cout<<"test7"<<endl;
    Rational r1;
    r1.getNom();
}

Run Code Online (Sandbox Code Playgroud)

joh*_*ohn 6

class Polinomial {

private:
    static int degree;
    static int falsse_degree;
    static double coEfArr[10];
Run Code Online (Sandbox Code Playgroud)

这是因为您已经声明了所有字段static(为什么要这样做?)。因为它们是静态的,所以无论Polinomial您创建多少个对象,每个字段都只存在一个副本。删除关键字static。这可能需要对您的代码进行大量其他更改。