重载类型转换
前言
operator type() const
类型转换只能重载为类的成员函数
类型转换没有返回值,它的返回值由类型转换的类型来决定
正文
昨天搞了字符串加数字合并成字符串
1 | hstring str{ "123abc" }; |
今天要逆转一下
1 | int x = (int)str; |
类似于这种操作;
1 | operator int(); |
看起来比较奇葩,而且虽然你没指定返回类型,但是编译的时候还是要你有一个返回值。
之前将数字转换成char类型通过ASCII码值去实现
就是字符0的十进制值为48
然后我们把数字+48转换成字符。
那么逆转之后,字符-48是否能为数字呢。
实践得真知~
这个原理没问题,但是要如何把这个数字转成长串,就是比如字符串"12345"
你转换成数字,就是一万两千三百四十五。
总不能1 * 1000 + 2 * 1000 + 3 * 100 + 4 * 10 + 5
这其实有点操蛋。。。因为位数是不确定的,这种写法还要手动去规避,做傻瓜式操作。
但是数学的思维还是发散的。
换个角度,
1 * 10
+ 2
* 10
+ 3
* 10
+ 4
* 10
+ 5
这样的话循环是肯定可以实现的,具有一定的逻辑性。
1 | char str[]{ "123456" }; |
ojbk,没啥问题。比之前那种*1000啥的就好很多。
不过这个只是解决了正数的问题,负数的情况下,这个就行不通了。
当然这种判断的可以用上次学的方法
1 | char str[]{ "-123456" }; |
也就是负数乘以 -1
正数乘以 1
关键就看那个布尔值*2-1。
然后还是float的问题
浮点数有小数点,不过按照编译器原有的习惯,浮点数转int是不保留小数的,所以在if那边做手脚还是容易的。
1 | char str[]{ "gsdahr" }; |
丢弃精度来的最容易,而且字符串里面非数字的话,就直接是0了,也规避了一些问题。
合并到类里面。
1 | hstring::operator int(){ |
合并难度不大,就是要注意这个c_str是hstring的本质,也就是那个成员变量。
所以调用的时候都是类重载也是有这个原因的。
都没问题,就是注意不要溢出,因为样例用的都是以int类型做参考的,没用设置longlong那种长度
结语
功能上bug还是有不少~~~慢慢再修吧