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) が含まれているconst
volatile
かどうかによって変わります。 次の構文では、メンバー関数の this
型について説明します。
[cv-qualifier-list
] class-type
* const this
メンバー関数の宣言子が決定します cv-qualifier-list
。 const
または volatile
(またはその両方) になります。 class-type
の名前を指定します class。
ポインターを this
再割り当てすることはできません。 メンバー関数宣言で使用される修飾子volatile
はconst
、次の表にclass示すように、その関数のスコープ内でポインターがポイントするインスタンスthis
に適用されます。
メンバー関数の宣言 | 名前付きポインターclassのthis 型myClass |
---|---|
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
宣言されたメンバー関数。 関数では const
、 this
ポインターはオブジェクトへの const
ポインターです。
Note
Constructors および destructors は const
または volatile
として宣言できません。 ただし、const
または volatile
オブジェクトについて呼び出すことはできます。
関連項目
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示