結構解引用運算符

結構解引用運算符(英語: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頁。