2016-02-04 63 views
6

我想了解「this」指針。我認爲「this」指針指向類對象的值。 然而,在下面的代碼,我可以看到的 「this」 指針的不同值:C++:瞭解「this」指針

#include <stdio.h> 

class InterfaceA{ 
public: 
    virtual void funa() = 0; 
}; 

class InterfaceB{ 
public: 
    virtual void funb() = 0; 
}; 

void globala(InterfaceA* obj){ 
    printf("globalA: pointer: %p\n\r",obj); 
} 
void globalb(InterfaceB* obj){ 
    printf("globalB: pointer: %p\n\r",obj); 
} 
class concrete : public InterfaceA, public InterfaceB{ 
public: 
    void funa(){ 
     printf("funa: pointer: %p\n\r",this); 
     globala(this); 
     globalb(this); 
    } 

    void funb(){ 
     printf("funb: pointer: %p\n\r",this); 
     globala(this); 
     globalb(this); 
    } 
}; 

int main(int argc, char *argv[]) 
{ 
    concrete ac; 
    ac.funa(); 
    ac.funb(); 
    return 0; 
} 

這個節目的輸出提供:

funa: pointer: 0x7ffff67261a0 
globalA: pointer: 0x7ffff67261a0 
globalB: pointer: 0x7ffff67261a8 
funb: pointer: 0x7ffff67261a0 
globalA: pointer: 0x7ffff67261a0 
globalB: pointer: 0x7ffff67261a8 

任何幫助理解這一點。

謝謝。

+0

我認爲你的實際問題是什麼時候以及爲什麼當一個指針的值傳遞給一個指向一個dif的函數不同階層。 –

+0

我發現你的問題非常有趣,我非常掙扎,爲了不讓這個問題得到解決。我發佈了一個擴展的答案,其中一些數字試圖解釋相應(重複)問題中的對象佈局。隨時檢查它,它可能會幫助你! – sestus

回答

5

我認爲「這個」指針指的是類對象的值。

正確。 this總是指向調用成員函數的對象。

我能看到的 「this」 指針

哦不同的價值觀,但你不打印this(在globalAglobalB)。您正在打印obj,它甚至沒有與this相同的類型。

this的類型爲concrete*。當你將它傳遞給一個帶有參數類型爲InterfaceB*的函數時,該指針隱含地指向另一個類型的converted。允許轉換,因爲interfaceBconcrete的基礎。轉換的指針將不再指向this對象,而是一個基類子對象。子對象(基類實例或成員)可能會但不可能具有與主對象相同的地址。對象的子對象不能共享地址,因此至多有一個子對象可能具有與主對象相同的地址 - 除了empty base optimization的情況外。

0

this是一個指向調用成員函數的對象的指針。

this的類型取決於成員函數。

例如,對於class X,如果成員函數是

1)常量,然後this是類型的const X*

2)揮發,然後thisvolatile X*

否則是