运算符重载: 成员访问运算符
2024年1月2日 2024年1月3日
- | |
---|---|
解引用运算符 * |
建议定义为成员函数 |
箭头运算符 -> |
必须定义为成员函数 |
解引用运算符
*
返回对象的引用
为StrBlobPtr实现解引用运算符
1string &operator*() const 2{ 3 auto p = check(curr, "deference past end"); 4 return (*p)[curr]; 5}
箭头运算符
->
作为成员函数, 形参列表为空
-
返回指向对象的指针
1T a; // 将T理解为类指针类型, 重载了箭头运算符 2a->mem; 3 4// => 5// a.operator->()->mem;
-
返回 重载了箭头运算符 类型的对象
对箭头运算符进行重载,返回指向待访问对象的指针, 或者重载了箭头运算符类型的对象
为StrBlobPtr重载箭头运算符
1string *operator->() const 2{ 3 return & this->operator*(); 4}
箭头运算符的2种使用情形
-
内置箭头运算符
1pointer->mem; 2 3// => 4// (*pointer).mem;
-
重载为类的成员
1pointer->mem; 2 3// => 4// pointer.operator->()->mem;
箭头运算符返回一个对象
- 类型A重载了箭头运算符, 返回类型B对象
- 类型B亦重载了箭头运算符, 返回指针
1A a; 2a->mem; 3 4// => 5// a.operator->()->mem; 6 7// a.opeartor->().operator->()->mem;
测试StrBlobPtr
1StrBlob a1 = {"hi", "bye", "now"}; 2StrBlobPtr p(a1); 3*p = "okay"; // 对当前元素赋值 4cout << p->size() << endl; // "okay"长度 5cout << (*p)->size() << endl; // 同上