我的目的是实现一个大整数类.
如果我尝试为对象赋值,则必须以这种方式完成
Big_int n =1234567890123456;
而不是这样
Big_int n ="1234567890123456";
Wojtek Surow.. 5
最好为此使用用户定义的文字.从C++ 11开始,它们在C++中可用.要接受任意长的数字序列,您需要使用文字函数接受const char*
.
以下代码为您提供了用户定义的文字所需的草稿:
#include#include class BigInt { const std::string str; BigInt(const std::string& s) : str(s) { } friend BigInt operator "" _bi(const char* s); friend std::ostream& operator<<(std::ostream& os, const BigInt& bi); }; BigInt operator "" _bi(const char* s) { return BigInt(s); } std::ostream& operator<<(std::ostream& os, const BigInt& bi) { return os << bi.str; } int main() { BigInt bi1 = 123_bi; BigInt bi2 = 123123412345123456123456712345678_bi; //BigInt bi3 = std::string("123"); std::cout << bi1 << ' ' << bi2; return 0; }
文字运算符函数operator ""
接受字符串文字.我使它成为BigInt类的朋友,因此接受字符串的构造函数对您的类的用户不可用 - 但您可以使用带_bi
后缀的数字序列.唯一的缺点是带有const char*
参数的文字运算符函数是整数和浮点文字的回退函数,所以仍然可以使用像
BigInt bi = 123.45_bi;
要阻止它,您可以声明额外的
class Dummy {}; Dummy operator "" _bi(long double d) { return Dummy(); }
如果您的BigInt类无法使用a进行初始化Dummy
,如果您尝试将BigInt与浮点_bi
文字一起使用,则会出现编译时错误.
最好为此使用用户定义的文字.从C++ 11开始,它们在C++中可用.要接受任意长的数字序列,您需要使用文字函数接受const char*
.
以下代码为您提供了用户定义的文字所需的草稿:
#include#include class BigInt { const std::string str; BigInt(const std::string& s) : str(s) { } friend BigInt operator "" _bi(const char* s); friend std::ostream& operator<<(std::ostream& os, const BigInt& bi); }; BigInt operator "" _bi(const char* s) { return BigInt(s); } std::ostream& operator<<(std::ostream& os, const BigInt& bi) { return os << bi.str; } int main() { BigInt bi1 = 123_bi; BigInt bi2 = 123123412345123456123456712345678_bi; //BigInt bi3 = std::string("123"); std::cout << bi1 << ' ' << bi2; return 0; }
文字运算符函数operator ""
接受字符串文字.我使它成为BigInt类的朋友,因此接受字符串的构造函数对您的类的用户不可用 - 但您可以使用带_bi
后缀的数字序列.唯一的缺点是带有const char*
参数的文字运算符函数是整数和浮点文字的回退函数,所以仍然可以使用像
BigInt bi = 123.45_bi;
要阻止它,您可以声明额外的
class Dummy {}; Dummy operator "" _bi(long double d) { return Dummy(); }
如果您的BigInt类无法使用a进行初始化Dummy
,如果您尝试将BigInt与浮点_bi
文字一起使用,则会出现编译时错误.