前言

operator type() const
类型转换只能重载为类的成员函数
类型转换没有返回值,它的返回值由类型转换的类型来决定


正文

昨天搞了字符串加数字合并成字符串

1
2
3
hstring str{ "123abc" };
str + -321;
std::cout << str;

今天要逆转一下

1
int x = (int)str;

类似于这种操作;

1
2
3
4
5
operator int();

hstring::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
2
3
4
5
6
7
char str[]{ "123456" };
int x = 0;
int i = 0;
while (str[i]){
x = x * 10 + str[i++] - 48;
}
std::cout << x;

ojbk,没啥问题。比之前那种*1000啥的就好很多。

不过这个只是解决了正数的问题,负数的情况下,这个就行不通了。

当然这种判断的可以用上次学的方法

1
2
3
4
5
6
7
8
char str[]{ "-123456" };
int x = 0;
int i = (str[0]=='-');
while (str[i]){
x = x * 10 + str[i++] - 48;
}
x *= ((str[0]!='-') * 2 - 1);
std::cout << x;

也就是负数乘以 -1
正数乘以 1
关键就看那个布尔值*2-1。


然后还是float的问题
浮点数有小数点,不过按照编译器原有的习惯,浮点数转int是不保留小数的,所以在if那边做手脚还是容易的。

1
2
3
4
5
6
7
8
char str[]{ "gsdahr" };
int x = 0;
int i = (str[0]=='-');
while (str[i] >= '0' && str[i] <= '9'){
x = x * 10 + str[i++] - 48;
}
x *= ((str[0]!='-') * 2 - 1);
std::cout << x;

丢弃精度来的最容易,而且字符串里面非数字的话,就直接是0了,也规避了一些问题。


合并到类里面。

1
2
3
4
5
6
7
8
9
hstring::operator int(){
int x = 0;
int i = (c_str[0] == '-');
while (c_str[i] >= '0' && c_str[i] <= '9'){
x = x * 10 + c_str[i++] - 48;
}
x *= ((c_str[0] != '-') * 2 - 1);
return x;
}

合并难度不大,就是要注意这个c_str是hstring的本质,也就是那个成员变量。

所以调用的时候都是类重载也是有这个原因的。

都没问题,就是注意不要溢出,因为样例用的都是以int类型做参考的,没用设置longlong那种长度


结语

功能上bug还是有不少~~~慢慢再修吧