C++結構體寫高精度模板中建構函式問題
三叔
三叔 2017-06-12 09:24:48
0
1
1106

結構體重載運算子的疑惑

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

中的

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

作用是什麼?
如果刪除這兩個語句編譯仍能正常通過但

bign n=123;

會編譯錯誤,但

bign n;
n=123;

能正常編譯
結構體的初始化不應該是
bign n(123);
小白試了試發現結果無差別,這是什麼原理?
望大神相助

三叔
三叔

全部回覆(1)
伊谢尔伦

引用一個貼文:http://www.cnblogs.com/chio/a...。賦值操作是在兩個已經存在的物件間進行的,而初始化是要建立一個新的對象,並且其初始值來自另一個已存在的物件。編譯器會區別這兩種情況,賦值的時候呼叫重載的賦值運算符,初始化的時候呼叫拷貝構造函數。如果類別中沒有拷貝建構函數,則編譯器會提供一個預設的。這個預設的拷貝建構子只是簡單地複製類別中的每個成員。

bign n=123;

呼叫的是拷貝建構子:

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

你註解到之後當然會出錯,而

bign n;
n=123;

先呼叫預設建構函數,然後呼叫賦值運算符,所以註解掉兩個函數後沒有錯。

你可以自己debug一下。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板