2016-01-08 23 views
1
#include <iostream> 
using namespace std; 
class myclass 
{ 

public: 
    void fun() 
    { 
     cout<<"Having some fun"<<endl; 
    } 
}; 


class spointer 
{ 
    myclass * mptr; 
public: 
    spointer(myclass * m) 
    { 
     mptr=m; 
    } 

    myclass * operator->() 
    { 
     return mptr; 
    } 

}; 


int main() { 
    // your code goes here 

    spointer s(new myclass); 

    s->fun(); 
    return 0; 
} 

s->fun()被稱爲mains->將返回指針myclass,但再怎麼fun()被稱爲由指針指向myclass對象?指針訪問操作符如何工作?


編輯:自spointer::operator->返回一個指向myclass,一個原因可以說s->fun(),而不必說s->->fun()什麼

+0

對不起。你的問題到底是什麼? –

+2

@JoelCornett我在猜測,因爲'spointer :: operator->'返回一個指向'myclass'的指針,爲什麼可以說's-> fun()',而不必說s - > - > fun ()'或什麼的。我認爲這是一個有效的問題。 – juanchopanza

+0

@JoelCornett juanchopanza,解釋正確。 – q126y

回答

6

C++的11個標準說,這對重載->運營商(13.5 0.6「重載/重載操作/類成員的訪問」):

表達X->米被解釋爲對(x.operator->())->m類型T的如果一個類對象x存在,如果操作員通過重載決策機制

所以成員訪問運算符(->)施加過載執行的結果選爲最佳匹配功能(導致行爲像您s->->fun()評論)。這允許在實現智能指針或指針代理時,過載「自然」運行。

+3

如果'operator->'返回一個類(不是指針),也可以'級聯',這個類也有'operator->' – sp2danny