结构解引用运算符

结构解引用运算符(英語:Structure dereference operator),也称“通过指针访问成员运算符”(Element selection through pointer),是 C语言C++->运算符。其功能是获取运算符左侧的指针所指向的对象的某个成员(member b of object pointed to by a)。例如:

struct foo{
  int value;
}

foo *p=new foo();
std::cout<<p->value;

该运算符的优先级较高,与函数调用运算符( )数组下标运算符[ ]通过引用选择成员运算符.相同。也是自左向右结合。即p->a->b等价于(p->a)->b

该运算符可以视作为解引用运算符*语法糖。即p->a相当于(*p).a

C++对该运算符的使用规定为:[1]

  1. 运算符左端如果是个指针类型,则直接对该指针类型解引用访问所指向对象的成员。即该运算符重载在此情形下未被使用。
  2. 运算符左端如果不是指针类型,编译器则调用该运算符的重载版本。如果没有重载版本则编译报错。该运算符的重载版本的返回值,或者是指针类型,或者是内含重载定义了->运算符的类型;对这两种情形编译器分别做指针解引用与递归调用返回类型的重载版本的->运算符。

运算符重载的示例代码

  #include <iostream>


  class foo
{
public:
    void func(){
        std::cout<<"foo say hello "<<std::endl;
    }
};
class bar
{
    foo a;
public:
    foo* operator->(){
        return &a;
    }
    void func(){
        std::cout<<"bar said hello"<<std::endl;
    }
};
class D
{
    bar b;
public:
    bar operator->(){
        return b;
    }
    void func(){
        std::cout<<"D said hello"<<std::endl;
    }
};

int main()
{
    D dumb, *pd=&dumb;
    pd->func(); //pc为一个类的指针 所以直接解引用
    D d;
    d->func(); //d不是一个指针类型,所以调用了D::operator->()重载版本
}

参考文献

  1. ^ 《C++ Primer》中文版第445页。