this ポインターthis Pointer

このポインターは、ポインターの非静的メンバー関数内でのみアクセス可能なクラス構造体、または共用体型。The this pointer is a pointer accessible only within the nonstatic member functions of a class, struct, or union type. これは、呼び出されるメンバー関数によって処理されるオブジェクトを指します。It points to the object for which the member function is called. 静的メンバー関数はありません、このポインター。Static member functions do not have a this pointer.

構文Syntax

this
this->member-identifier

RemarksRemarks

オブジェクトのこのポインター オブジェクト自体の一部でないの結果には反映されず、 sizeofオブジェクトのステートメント。An object's this pointer is not part of the object itself; it is not reflected in the result of a sizeof statement on the object. その代わりに、非静的メンバー関数がオブジェクトに対して呼び出されると、オブジェクトのアドレスが関数の隠し引数としてコンパイラに渡されます。Instead, when a nonstatic member function is called for an object, the address of the object is passed by the compiler as a hidden argument to the function. たとえば、次の関数を呼び出してみましょう。For example, the following function call:

myDate.setMonth( 3 );

これは次のように解釈できます。can be interpreted this way:

setMonth( &myDate, 3 );

オブジェクトのアドレスは、メンバー関数内から利用できる、このポインター。The object's address is available from within the member function as the this pointer. ほとんどの用途このが暗黙的に指定します。Most uses of this are implicit. 明示的に使用する、不要な場合は法律、このクラスのメンバーを参照する場合。It is legal, though unnecessary, to explicitly use this when referring to members of the class. 例:For example:

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

*this は、通常、メンバー関数から現在のオブジェクトを返すために使用されます。The expression *this is commonly used to return the current object from a member function:

return *this;

このポインターは自己参照からの保護にも使用されます。The this pointer is also used to guard against self-reference:

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

注意

このポインターは変更できない場合は、割り当てをこれは許可されていません。Because the this pointer is nonmodifiable, assignments to this are not allowed. C++ の初期の実装への割り当てを許可するこのします。Earlier implementations of C++ allowed assignments to this.

場合によっては、このポインターを直接使用 — たとえば、自己参照データを操作する構造体の現在のオブジェクトのアドレスが必要な場合。Occasionally, the this pointer is used directly — for example, to manipulate self-referential data structures, where the address of the current object is required.

Example

// 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 ポインターの型Type of the this pointer

このポインターの型は、関数宣言で変更できる、 const揮発性キーワード。The this pointer's type can be modified in the function declaration by the const and volatile keywords. これらのキーワードの属性を持つものとして関数を宣言するには、関数の引数リストの後にキーワードを追加します。To declare a function as having the attributes of one or more of these keywords, add the keyword(s) after the function argument list.

次の例について考えます。Consider this example:

// type_of_this_pointer1.cpp
class Point
{
    unsigned X() const;
};
int main()
{
}

上記のコードは、メンバー関数を宣言しますX、これで、これポインターとして扱われます、 constへのポインターをconstオブジェクト。The preceding code declares a member function, X, in which the this pointer is treated as a const pointer to a const object. 組み合わせリスト mod cv ・ オプションを使用できますしますが、指すオブジェクトを常に変更このではなく、このポインター自体。Combinations of cv-mod-list options can be used, but they always modify the object pointed to by this, not the this pointer itself. そのため、次の宣言は関数を宣言します。 Xこのポインターが、 constへのポインターをconstオブジェクト。Therefore, the following declaration declares function X; the this pointer is a const pointer to a const object:

// type_of_this_pointer2.cpp
class Point
{
    unsigned X() const;
};
int main()
{
}

この次の構文で、メンバー関数が説明されている場所cv 修飾子のリストはメンバー関数宣言子から決定され、 constまたは揮発性(または両方) およびクラス型クラスの名前を指定します。The type of this in a member function is described by the following syntax, where cv-qualifier-list is determined from the member functions declarator and can be const or volatile (or both), and class-type is the name of the class:

[cv 修飾子一覧] クラス型 * const これ[cv-qualifier-list] class-type * const this

つまり、この; の const ポインターは、常に再割り当てできません。In other words, this is always a const pointer; it cannot be reassigned. Constまたは揮発性メンバー関数の宣言で使用される修飾子が指すクラス インスタンスに適用このでその関数のスコープ。The const or volatile qualifiers used in the member function declaration apply to the class instance pointed to by this in the scope of that function.

次の表は、これらの修飾子の機能について詳細を示します。The following table explains more about how these modifiers work.

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

修飾子Modifier 説明Meaning
constconst メンバーのデータを変更することはできません。ないメンバー関数を呼び出すことはできませんconstします。Cannot change member data; cannot invoke member functions that are not const.
volatilevolatile メンバー データはアクセスされるたびにメモリから読み込まれます。特定の最適化は無効になります。Member data is loaded from memory each time it is accessed; disables certain optimizations.

渡すとエラーには、 constオブジェクトでないメンバー関数をconstします。It is an error to pass a const object to a member function that is not const. 同様に、渡すとエラーには、揮発性オブジェクトでないメンバー関数を揮発性します。Similarly, it is an error to pass a volatile object to a member function that is not volatile.

メンバー関数として宣言constメンバー データを変更することはできません: このような関数の場合、このポインターへのポインターをconstオブジェクト。Member functions declared as const cannot change member data — in such functions, the this pointer is a pointer to a const object.

注意

コンス トラクターとデストラクターとして宣言することはできませんconstまたは揮発性します。Constructors and destructors cannot be declared as const or volatile. あること、ただしで呼び出されるconstまたは揮発性オブジェクト。They can, however, be invoked on const or volatile objects.

関連項目See also

キーワードKeywords