次の方法で共有


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 ポインターは、状況によっては、直接使用されることがあります。たとえば、現在のオブジェクトのアドレスが必要なときに、自己参照用のデータ構造体を操作する場合などです。

// 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 ポインターの型は、関数宣言に const キーワードまたは volatile キーワードが含まれているかどうかによって変わります。 次の構文では、メンバー関数の this の種類について説明します。

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

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

メンバー関数の宣言 myClass という名前の class の this ポインターの型
void Func() myClass *
void Func() const const myClass *
void Func() volatile volatile myClass *
void Func() const volatile const volatile myClass *

下の表では、const および volatile について詳しく説明しています。

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

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

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

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

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

Note

コンストラクターとデストラクターは、const または volatile として宣言できません。 ただし、const または volatile オブジェクトについて呼び出すことはできます。

関連項目

キーワード