对输入的字符串进行初始化,去掉前缀0,所有的0都统一为+0,不会有-0出现。输入会检查输入流状态,输出按照常规不输出正号。利用构造函数初始化列表先初始化私有数据成员可以提高效率,即直接调用string的构造函数先初始化,从而省去了先调用string默认构造函数,再在构造函数里面初始化私有数据成员的步骤。输入输出流要按常规返回流的引用。凡是引用的参数,如果不改变其值都要加const,如果是值传递则除非强制不能改变其值,否则不加const。

inline BigInt::BigInt() : num("+0"){}

inline BigInt::BigInt(const string& strnum) : num(strnum)
{
    if(num.size() > 0){
        if(num[0] != '-' && num[0] != '+'){
            string::size_type i = 0;
            for(; i < num.size() - 1 && num[i] == '0'; ++i);
            if(i > 0)
                num.replace(0, i, "+");
            else
                num.insert(0, 1, '+');
        } else {
            if(num.size() == 1)
                num = "+0";
            else{
                string::size_type i = 1;
                for(; i < num.size() - 1 && num[i] == '0'; ++i);
                if(i > 1)
                    num.erase(1, i-1);
                if(num == "-0")
                    num[0] = '+';
            }
        }
    } else
        num = "+0";
}

inline BigInt::BigInt(const BigInt& val) : num(val.num){}

inline BigInt::BigInt(int n)
{
    if(n >= 0)
        num = '+';
    else {
        num = '-';
        n *= -1;
    }
    string temp;
    while(n){
        temp += n % 10 + '0';
        n /= 10;
    }
    for(int i = temp.size() - 1; i >= 0; --i)
        num += temp[i];
}

inline BigInt::BigInt(const char* str) : num(str)
{
    if(num.size() > 0){
        if(num[0] != '-' && num[0] != '+'){
            string::size_type i = 0;
            for(; i < num.size() - 1 && num[i] == '0'; ++i);
            if(i > 0)
                num.replace(0, i, "+");
            else
                num.insert(0, 1, '+');
        } else {
            if(num.size() == 1)
                num = "+0";
            else{
                string::size_type i = 1;
                for(; i < num.size() - 1 && num[i] == '0'; ++i);
                if(i > 1)
                    num.erase(1, i-1);
                if(num == "-0")
                    num[0] = '+';
            }
        }
    } else
        num = "+0";
}

istream& operator>>(istream& in, BigInt& val)
{
    in >> val.num;
    if(in){
        if(val.num[0] != '-' && val.num[0] != '+'){
            string::size_type i = 0;
            for(; i < val.num.size() - 1 && val.num[i] == '0'; ++i);
            if(i > 0)
                val.num.replace(0, i, "+");
            else
                val.num.insert(0, 1, '+');
        } else {
            if(val.num.size() == 1)
                val.num = "+0";
            else{
                string::size_type i = 1;
                for(; i < val.num.size() - 1 && val.num[i] == '0'; ++i);
                if(i > 1)
                    val.num.erase(1, i-1);
                if(val.num == "-0")
                    val.num[0] = '+';
            }
        }
    } else 
        val = BigInt();
    return in;
}

ostream& operator<<(ostream& os, const BigInt& val)
{
    if(val.num[0] == '-')
        os << val.num;
    else
        os << val.num.substr(1);
    return os;
}