当前位置:  开发笔记 > 编程语言 > 正文

是否有可能在C++中重载""?

如何解决《是否有可能在C++中重载""?》经验,为你挑选了1个好方法。

我的目的是实现一个大整数类.

如果我尝试为对象赋值,则必须以这种方式完成

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文字一起使用,则会出现编译时错误.



1> Wojtek Surow..:

最好为此使用用户定义的文字.从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文字一起使用,则会出现编译时错误.

推荐阅读
手机用户2502851955
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有