Rumah  >  Soal Jawab  >  teks badan

Isu dengan fungsi pembina dalam menulis templat berketepatan tinggi menggunakan struktur C++

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

三叔三叔2657 hari yang lalu1032

membalas semua(1)saya akan balas

  • 伊谢尔伦

    伊谢尔伦2017-06-12 09:26:48

    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.

    balas
    0
  • Batalbalas