このポインター
this のポインター クラス はstructまたは 共用体 の型の非静的メンバー関数内でのみアクセス可能なポインターです。またメンバー関数が呼び出されたオブジェクトをポイントします。静的メンバー関数へのポインター this はありません。
this
this->member-identifier
解説
オブジェクトの this のポインターはオブジェクト自体の一部ではありません ; またオブジェクトの sizeof ステートメントの結果に反映されません。代わりに非静的メンバー関数はオブジェクトに対して呼び出されるとオブジェクトのアドレスが関数に非表示のコンパイラを引数として渡されます。たとえば次の関数呼び出し :
myDate.setMonth( 3 );
このように解釈できます。:
setMonth( &myDate, 3 );
オブジェクトのアドレスは this のポインターとしてメンバー関数で利用できます。this の主な用途は暗黙的です。これはクラスのメンバーを参照する場合は不要で明示的に 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
[!メモ]
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 opperator
myBuf = yourBuf;
// Display 'your buffer'
myBuf.Display();
}