【轉】C++對成員訪問運算子->的重載

來源:互聯網
上載者:User

標籤:div   ace   app   author   編譯器   轉換   targe   操作符   include   

 運算子->的重載比較特別,它只能是非靜態成員函數形式,而且沒有參數。

1、如果傳回值是一個原始指標,那麼就將運算子的右運算元當作這個原始指標所指向類型的成員進行訪問;

2、如果傳回值是另一個類型的執行個體,那麼就繼續調用這個傳回型別的operator->(),直到有一個調用返回一個原始指標為止,然後按第一種情況處理。

 

如果上述條件不滿足(如:右運算元不是返回的原始指標指向的類型中的成員,或者,返回的非指標類型(另一個類型的執行個體)沒有重載operator->()),那麼編譯將報錯。

 

以下是用於驗證的程式片段:

/******************************************************** File Name:main.cpp* Description:示範成員訪問操作符->的重載 * Version:V1.0 * Author:Mengjia * Date:2018-05-20 * Copyright (C)2018, Mengjia* Others:******************************************************************************運算子->的重載比較特別,它只能是非靜態成員函數形式(即不能在類外重載),而且沒有參數。1、如果傳回值是一個原始指標,那麼就將運算子的右運算元當作這個原始指標所指向類型的成員進行訪問;2、如果傳回值是另一個類型的執行個體,那麼就繼續調用這個傳回型別的operator->(),直到有一個調用返回一個原始指標為止,然後就按第一種情況處理。如果上述條件不滿足(如:右運算元不是返回的原始指標指向的類型的成員,或者,返回的另一個類型的執行個體中沒有重載operator->()),那麼編譯將報錯。*************************************************************************************************************************************/#include <iostream>using namespace std;//原始類struct Origin{    int a;};//封裝器類1,封裝Origin類struct Wrapper{    Origin* orig;    Origin* operator->() const     {        return orig;    //返回原始指標    }};//封裝器類2,封裝Wrapper類struct Wrapper2{    Wrapper* wrap;    Wrapper& operator->() const    {        return *wrap;    //返回類對象    }};int main(){    Origin o;    o.a = 7;    Wrapper w;    w.orig = &o;    Wrapper2 w2;    w2.wrap = &w;    cout << "w->a" << "\t\t\t\t" << w->a << endl;        cout << "w.operator->()" << "\t\t\t" << w.operator->() << endl;    cout << "w.operator->()->a" << "\t\t" << w.operator->()->a << endl;        cout << "w2->a" << "\t\t\t\t" << w2->a << endl;    cout << "&w2.operator->()" << "\t\t" << &w2.operator->() << endl;    cout << "w2.operator->()->a" << "\t\t" << w2.operator->()->a << endl;    cout << "w2.operator->().operator->()" << "\t" << w2.operator->().operator->() << endl;    cout << "w2.operator->().operator->()->a" << "\t" << w2.operator->().operator->()->a << endl;    system("pause");    return 0;}/**輸出結果:w->a                            7w.operator->()                  00AFF7E4w.operator->()->a               7w2->a                           7&w2.operator->()                00AFF7D8w2.operator->()->a              7w2.operator->().operator->()    00AFF7E4w2.operator->().operator->()->a 7**/

其中,最為詭異的就是w2->a輸出的是7。

按照上面總結的結論,這個調用其實會被編譯器轉換成w2.operator->().operator->()->a的形式,所以輸出的是7。

 

轉自《C++對成員訪問操作符->的重載》

【轉】C++對成員訪問運算子->的重載

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.