結構反參考運算子

結構反參考運算子(英語: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頁。