Isu dengan fungsi pembina dalam menulis templat berketepatan tinggi menggunakan struktur C++
三叔
三叔 2017-06-12 09:24:48
0
1
1082

Kekeliruan tentang pengendali lebihan beban struktur

#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;
}

dalam

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

Apakah fungsinya?
Jika anda memadam kedua-dua kenyataan ini, kompilasi masih boleh lulus seperti biasa tetapi

bign n=123;

akan menyusun ralat, tetapi

bign n;
n=123;

Ia boleh dikompilasi secara normal
Pemulaan struktur tidak sepatutnya
bign n(123);
Seorang pemula mencuba dan mendapati bahawa hasilnya tidak berbeza
Berharap untuk bantuan

三叔
三叔

membalas semua(1)
伊谢尔伦

Memetik siaran: http://www.cnblogs.com/chio/a…. Tugasan dilakukan antara dua objek sedia ada, manakala permulaan adalah untuk mencipta objek baharu, dan nilai awalnya datang daripada objek sedia ada yang lain. Pengkompil akan membezakan antara kedua-dua situasi ini, memanggil pengendali tugasan terlampau beban semasa tugasan, dan memanggil pembina salinan semasa pemula. Jika tiada pembina salinan dalam kelas, pengkompil akan menyediakan yang lalai. Pembina salinan lalai ini hanya menyalin setiap ahli kelas.

bign n=123;

Pembina salinan dipanggil:

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

Sudah tentu anda akan membuat kesilapan selepas anda mengulas, dan

bign n;
n=123;

Pembina lalai dipanggil dahulu, dan kemudian pengendali tugasan dipanggil, jadi tidak ada yang salah selepas mengulas kedua-dua fungsi tersebut.

Anda boleh nyahpepijat sendiri.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan