Issues with constructor functions in writing high-precision templates using C++ structures
三叔
三叔 2017-06-12 09:24:48
0
1
1108

Confusion about structure overloading operators

#include<iostream>
#include<string>
#include<cstring>
#include<cstdio>
using namespace std;
const int N = 1005;
struct bign
{
    int len,s[N];
    bign()  {  memset(s,0,sizeof(s));  len=1;  }
    bign(int num)  {  *this=num; }
    bign(char *num) { *this=num; }
    bign operator =(int num)
    {
        char c[N];
        sprintf(c,"%d",num);
        *this=c;
        return *this;
    }
    bign operator =(const char *num)
    {
        len=strlen(num);
        for (int i=0;i<len;i++) s[i]=num[len-1-i]-'0';
        return *this;
    }
    string str()
    {
        string res="";
        for (int i=0;i<len;i++) res=(char)(s[i]+'0')+res;
        return res;
    }
    void clean()
    {
        while (len>1&&!s[len-1]) len--;
    }
    bign operator +(const bign &b)
    {
        bign c;    
        c.len=0;
        for (int i=0,g=0;g||i<len||i<b.len;i++)
        {
            int x=g;
            if (i<len) x+=s[i];
            if (i<b.len) x+=b.s[i];
            c.s[c.len++]=x%10;
            g=x/10;
        }
        return c;
    }
    bign operator -(const bign &b)
    {
        bign c;
        c.len=0;
        int x;     
        for (int i=0,g=0;i<len;i++)
        {
            x=s[i]-g;
            if (i<b.len) x-=b.s[i];
            if (x>=0) g=0;
            else{          
                x+=10;
                g=1;
            };
            c.s[c.len++]=x;
        }
        c.clean();
        return c;
    }
    bign operator *(const bign &b)
    {
        bign c;
        c.len=len+b.len;
        for (int i=0;i<len;i++) for (int j=0;j<b.len;j++) c.s[i+j]+=s[i]*b.s[j];
        for (int i=0;i<c.len-1;i++) { c.s[i+1]+=c.s[i]/10; c.s[i]%=10; }
        c.clean();
        return c;  
    }
    bool operator <(const bign &b)
    {
        if (len!=b.len) return len<b.len;
        for (int i=len-1;i>=0;i--)
             if (s[i]!=b.s[i]) return s[i]<b.s[i];
        return false;
    }
    bign operator +=(const bign &b)
    {
        *this=*this+b;
        return *this;
    }
    bign operator -=(const bign &b)
    {
        *this=*this-b;
        return *this;
    }  
};
istream& operator >>(istream &in,bign &x)
{
  string s;
  in>>s;
  x=s.c_str();
  return in;
}
ostream& operator <<(ostream &out,bign &x)
{
    out<<x.str();
    return out;
}
int main(){
    bign a,b,c;
    ios::sync_with_stdio(false);
    cin>>a>>b;
//    cout<<a<<endl;
//    cout<<b<<endl;
    c=a+b;
    cout<<c<<endl;
    return 0;
}

middle

bign(int num)  {  *this=num; }
bign(char *num) { *this=num; }

What is the function?
If you delete these two statements, the compilation can still pass normally but

bign n=123;

will compile errors, but

bign n;
n=123;

Can be compiled normally
The initialization of the structure should not be
big n(123);
Xiaobai tried it and found that there is no difference in the results. What is the principle?
Hope God can help

三叔
三叔

reply all(1)
伊谢尔伦

Quoting a post: http://www.cnblogs.com/chio/a…. Assignment is performed between two existing objects, while initialization is to create a new object, and its initial value comes from another existing object. The compiler will distinguish between these two situations, calling the overloaded assignment operator during assignment, and calling the copy constructor during initialization. If there is no copy constructor in the class, the compiler will provide a default one. This default copy constructor simply copies every member of the class.

bign n=123;

The copy constructor is called:

bign(int num)  {  *this=num; }

Of course you will make an error after you comment, and

bign n;
n=123;

The default constructor is called first, and then the assignment operator is called, so there is nothing wrong after commenting out the two functions.

You can debug it yourself.

Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template