thisポインター

this ポインターは、class 型、struct 型、または union 型の非静的メンバー関数内でのみアクセスできるポインターです。 これは、呼び出されるメンバー関数によって処理されるオブジェクトを指します。 静的メンバー関数には this ポインターがありません。

構文

this
this->member-identifier

解説

オブジェクトの this ポインターは、オブジェクト自体の一部ではありません。 これは、オブジェクトのステートメントの結果の sizeof 一部ではありません。 非静的メンバー関数がオブジェクトに対して呼び出されると、コンパイラによってオブジェクトのアドレスが隠し引数として関数に渡されます。 たとえば、次の関数を呼び出してみましょう。

myDate.setMonth( 3 );

次のように解釈できます。

setMonth( &myDate, 3 );

このオブジェクトのアドレスは、メンバー関数内から this ポインターとして取得できます。 ほとんどの this ポインターは暗黙的に使用されます。 必須ではありませんが、class のメンバーを参照するときに明示的な this を使用することもできます。 次に例を示します。

void Date::setMonth( int mn )
{
   month = mn;            // These three statements
   this->month = mn;      // are equivalent
   (*this).month = mn;
}

*this は、通常、メンバー関数から現在のオブジェクトを返すために使用されます。

return *this;

this ポインターは、自己参照を防止するためにも使用されます。

if (&Object != this) {
// do not execute in cases of self-reference

Note

this ポインターは変更できないため、this ポインターへの代入はできません。 C++ の初期の実装では、this への代入ができました。

ポインターが this 直接使用される場合があります。たとえば、現在のオブジェクトのアドレスが必要な自己参照データ structの url を操作する場合などです。

// this_pointer.cpp
// compile with: /EHsc

#include <iostream>
#include <string.h>

using namespace std;

class Buf
{
public:
    Buf( char* szBuffer, size_t sizeOfBuffer );
    Buf& operator=( const Buf & );
    void Display() { cout << buffer << endl; }

private:
    char*   buffer;
    size_t  sizeOfBuffer;
};

Buf::Buf( char* szBuffer, size_t sizeOfBuffer )
{
    sizeOfBuffer++; // account for a NULL terminator

    buffer = new char[ sizeOfBuffer ];
    if (buffer)
    {
        strcpy_s( buffer, sizeOfBuffer, szBuffer );
        sizeOfBuffer = sizeOfBuffer;
    }
}

Buf& Buf::operator=( const Buf &otherbuf )
{
    if( &otherbuf != this )
    {
        if (buffer)
            delete [] buffer;

        sizeOfBuffer =  strlen( otherbuf.buffer ) + 1;
        buffer = new char[sizeOfBuffer];
        strcpy_s( buffer, sizeOfBuffer, otherbuf.buffer );
    }
    return *this;
}

int main()
{
    Buf myBuf( "my buffer", 10 );
    Buf yourBuf( "your buffer", 12 );

    // Display 'my buffer'
    myBuf.Display();

    // assignment operator
    myBuf = yourBuf;

    // Display 'your buffer'
    myBuf.Display();
}
my buffer
your buffer

this ポインターの型

ポインターの型はthis、関数宣言に キーワード (keyword) が含まれているconstvolatile かどうかによって変わります。 次の構文では、メンバー関数の this 型について説明します。

[cv-qualifier-list] class-type* const this

メンバー関数の宣言子が決定します cv-qualifier-listconst または volatile (またはその両方) になります。 class-type の名前を指定します class。

ポインターを this 再割り当てすることはできません。 メンバー関数宣言で使用される修飾子volatileconst、次の表にclass示すように、その関数のスコープ内でポインターがポイントするインスタンスthisに適用されます。

メンバー関数の宣言 名前付きポインターclassのthismyClass
void Func() myClass *
void Func() const const myClass *
void Func() volatile volatile myClass *
void Func() const volatile const volatile myClass *

次の表では、"'' のvolatile詳細についてconst説明します。

this 修飾子のセマンティクス

変更者 意味
const メンバー データを変更できません。const ではないメンバー関数を呼び出すことができません。
volatile メンバー データはアクセスされるたびにメモリから読み込まれます。特定の最適化は無効になります。

const オブジェクトを、const でないメンバー関数に渡すとエラーになります。

同様に、volatile オブジェクトを、volatile でないメンバー関数に渡すとエラーになります。

メンバー データを変更できないとして const 宣言されたメンバー関数。 関数では constthis ポインターはオブジェクトへの const ポインターです。

Note

Constructors および destructors は const または volatile として宣言できません。 ただし、const または volatile オブジェクトについて呼び出すことはできます。

関連項目

キーワード