六一的部落格


关关难过关关过,前路漫漫亦灿灿。



-
解引用运算符 * 建议定义为成员函数
箭头运算符 -> 必须定义为成员函数

解引用运算符

*

返回对象的引用


为StrBlobPtr实现解引用运算符

1string &operator*() const
2{
3    auto p = check(curr, "deference past end");
4    return (*p)[curr];
5}

箭头运算符

->

作为成员函数, 形参列表为空

  1. 返回指向对象的指针

    1T a;             // 将T理解为类指针类型, 重载了箭头运算符
    2a->mem;          
    3
    4// =>
    5// a.operator->()->mem;
    
  2. 返回 重载了箭头运算符 类型的对象

对箭头运算符进行重载,返回指向待访问对象的指针, 或者重载了箭头运算符类型的对象


为StrBlobPtr重载箭头运算符

1string *operator->() const
2{
3    return & this->operator*();
4}

箭头运算符的2种使用情形

  1. 内置箭头运算符

    1pointer->mem;
    2
    3// =>
    4// (*pointer).mem;
    
  2. 重载为类的成员

    1pointer->mem;
    2
    3// =>
    4// pointer.operator->()->mem;
    

箭头运算符返回一个对象

  1. 类型A重载了箭头运算符, 返回类型B对象
  2. 类型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;           // 同上

运算符重载: 成员访问运算符


-
解引用运算符 * 建议定义为成员函数
箭头运算符 -> 必须定义为成员函数

解引用运算符

*

返回对象的引用


为StrBlobPtr实现解引用运算符

1string &operator*() const
2{
3    auto p = check(curr, "deference past end");
4    return (*p)[curr];
5}

箭头运算符

->

作为成员函数, 形参列表为空

  1. 返回指向对象的指针

    1T a;             // 将T理解为类指针类型, 重载了箭头运算符
    2a->mem;          
    3
    4// =>
    5// a.operator->()->mem;
    
  2. 返回 重载了箭头运算符 类型的对象

对箭头运算符进行重载,返回指向待访问对象的指针, 或者重载了箭头运算符类型的对象


为StrBlobPtr重载箭头运算符

1string *operator->() const
2{
3    return & this->operator*();
4}

箭头运算符的2种使用情形

  1. 内置箭头运算符

    1pointer->mem;
    2
    3// =>
    4// (*pointer).mem;
    
  2. 重载为类的成员

    1pointer->mem;
    2
    3// =>
    4// pointer.operator->()->mem;
    

箭头运算符返回一个对象

  1. 类型A重载了箭头运算符, 返回类型B对象
  2. 类型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;           // 同上