前言

返回类型 operator()(类型 操作数);
看到这个圆括号或多或少可以猜到跟函数有关
()跟[]一样都只能重载为类的方法

  1. ()重载称为functor函数对象
  2. 不限制参数个数
  3. 可以做默认实参

利用()可以实现二维数组的访问方式


正文

1
const char& operator()();
1
2
3
const char &hstring::operator()(){
return c_str[0];
}

先随便玩一玩

看到当调用str()的时候不是出现其它函数,而是我们使用的重载,返回第一个元素
虽然有点抽象。

但是要实现个稍微有用点的功能就要构思一下,感觉截取会比较直接。

1
hstring operator()(const unsigned short _index, const unsigned short _length);

传递两个参数,一个起始位置,一个要截取的长度。

那么在设计的时候其实要考虑几个问题

  1. 字符串末尾0怎么处理
  2. 长度溢出是报错还是怎么处理
  3. 起始位置搞事情怎么办
1
2
3
4
5
6
7
8
9
hstring hstring::operator()(const unsigned short _index, const unsigned short _length){

if (_index > hsLen){
//若起始位置超过字符串长度是为非法
return hstring("");
}

return hstring;
}

像这种起始位置超过长度,就直接返回个空的也不是不行。

然后对于字符串末尾的0,忽略也不是什么大事,后期加个回去就行,毕竟不是显现的因素。

然后就是构建这个截取的字符串

1
2
3
4
unsigned short len = (_index + _length) > (hsLen - 1) ? hsLen - _index - 1 : _length;
char *newStr = new char[len + 1];
memcpy(newStr, c_str+_index, len);
newStr[len] = 0; //字符串末尾+0闭环

如果起始+截取长度超过字符串长度,就让len = 字符串长度-起始值-1,比如起始值1,截取15,字符串长度5,那么明显是超过了,利用我们的公式,len = 5-1-1。 == 3,也就是从1开始往后截取3位。
重新new的内存就要3+1,因为最后一个需要我们重置\0
拷贝函数就用现有的了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
hstring hstring::operator()(const unsigned short _index, const unsigned short _length){
/*
* hstring = "1234" 假设
* 首要考虑是否截取字符串末尾的\0,虽然意义不大,但是要控制长度
* 其次就是截取长度溢出,为了合法,就默认截取到最后一个
*/

if (_index > hsLen){
//若起始位置超过字符串长度是为非法
return hstring("");
}

unsigned short len = (_index + _length) > (hsLen - 1) ? hsLen - _index - 1 : _length;
char *newStr = new char[len + 1];
memcpy(newStr, c_str+_index, len);
newStr[len] = 0; //字符串末尾+0闭环

return hstring(newStr);
}

大致上应该就是这样。


结语

优化空间也有,内存方面或许可以考虑别的方法。