Aks*_*tel 1 c++ operator-overloading
我的目的是实现一个大整数类.
如果我尝试为对象赋值,则必须以这种方式完成
Big_int n =1234567890123456;
Run Code Online (Sandbox Code Playgroud)
而不是这样
Big_int n ="1234567890123456";
Run Code Online (Sandbox Code Playgroud)
最好为此使用用户定义的文字.从C++ 11开始,它们在C++中可用.要接受任意长的数字序列,您需要使用文字函数接受const char*
.
以下代码为您提供了用户定义的文字所需的草稿:
#include <iostream>
#include <string>
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;
}
Run Code Online (Sandbox Code Playgroud)
文字运算符函数operator ""
接受字符串文字.我使它成为BigInt类的朋友,因此接受字符串的构造函数对您的类的用户不可用 - 但您可以使用带_bi
后缀的数字序列.唯一的缺点是带有const char*
参数的文字运算符函数是整数和浮点文字的回退函数,所以仍然可以使用像
BigInt bi = 123.45_bi;
Run Code Online (Sandbox Code Playgroud)
要阻止它,您可以声明额外的
class Dummy {};
Dummy operator "" _bi(long double d) {
return Dummy();
}
Run Code Online (Sandbox Code Playgroud)
如果您的BigInt类无法使用a进行初始化Dummy
,如果您尝试将BigInt与浮点_bi
文字一起使用,则会出现编译时错误.
归档时间: |
|
查看次数: |
124 次 |
最近记录: |