Rumah > Soal Jawab > teks badan
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
伊谢尔伦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.