2016-02-04 13 views
6

"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に渡された関数に渡されたときferentクラス。 –

+0

私はあなたの質問を非常に興味深いと感じました、そして、私はそれを覆すために非常に苦労しました。私は、対応する(重複した)質問でオブジェクトのレイアウトを説明しようとしているいくつかの数字とともに、拡張された答えを掲示しました。それをチェックしてみてください、それはあなたを助けるかもしれません! – sestus

答えて

5

"this"ポインタがクラスオブジェクトの値を参照すると考えました。

正しい。 thisは、常にメンバー関数が呼び出されるオブジェクトを指します。

私は "この" ポインタ

ああの異なる値を見ることができる、しかし、あなたは(globalAglobalBで)thisを印刷していません。あなたはと同じタイプでもないobjを印刷しています。

concrete*です。型をInterfaceB*の引数をとる関数に渡すと、ポインタは暗黙的に他の型のconvertedになります。 interfaceBconcreteのベースであるため、変換が許可されます。変換されたポインタは、thisオブジェクトを指すのではなく、基本クラスのサブオブジェクトを指します。サブオブジェクト(基本クラスインスタンスまたはメンバ)は、メインオブジェクトと同じアドレスを持っていても構いません。オブジェクトのサブオブジェクトはアドレスを共有することができないため、ほとんどのサブオブジェクトはメインオブジェクトと同じアドレスを持つ可能性があります(empty base optimizationの場合を除く)。

0

は、メンバ関数を呼び出すオブジェクトを参照するポインタです。

タイプはthisです。メンバーの機能によって異なります。 class Xについては、例えば

、メンバ関数が

1である場合)CONST、次いでthisタイプconst X*

2である)揮発性、次いでthisvolatile X*

であるそうでない場合は

あります
関連する問題