最終更新:2026-10-12
C++ this ポインタ¶
著者について¶
個人公式アカウント(WeChat):

1.thisポインタ¶
ここにいる多くの方はPythonを学んでいることと思います。Pythonにはselfがありますが、C++でそれに対応するのがthisポインタです。それでは、thisポインタのクラス内での使い方を一緒に深く分析していきましょう!
まずthisポインタの用途から話しましょう:
(1)あるオブジェクトのthisポインタはオブジェクト自身の一部ではなく、sizeof(オブジェクト)の結果に影響を与えません。
(2)thisのスコープはクラス内部にあり、クラスの非静的メンバ関数の中からクラスの非静的メンバにアクセスするとき、コンパイラはオブジェクト自身のアドレスを暗黙の引数として関数に渡します。つまり、thisポインタを書かなくても、コンパイラはコンパイル時にthisを付加するのです。thisは非静的メンバ関数の暗黙の仮引数であり、各メンバへのアクセスはすべてthisを通じて行われます。
次に、thisポインタの使用方法です:
(1)クラスの非静的メンバ関数の中でクラスオブジェクト自身を返すときは、そのまま return *this を使います。
(2)引数とメンバ変数名が同じとき、例えば this->n = n (n = n と書くことはできません)。
また、インターネット上ではthisがコンパイラによってA *constやA const *に解釈されると見かけることがありますが、実際はどちらなのでしょうか?以下、ブレークポイントによるデバッグで分析してみます:
次のような例があります:
#include<iostream>
#include<cstring>
using namespace std;
class Person{
public:
typedef enum {
BOY = 0,
GIRL
}SexType;
Person(char *n, int a,SexType s){
name=new char[strlen(n)+1];
strcpy(name,n);
age=a;
sex=s;
}
int get_age() const{
return this->age;
}
Person& add_age(int a){
age+=a;
return *this;
}
~Person(){
delete [] name;
}
private:
char * name;
int age;
SexType sex;
};
int main(){
Person p("zhangsan",20,Person::BOY);
cout<<p.get_age()<<endl;
cout<<p.add_age(10).get_age()<<endl;
return 0;
}
この簡単なプログラムについては問題ないでしょう。クラスを定義し、コンストラクタで初期化してこの人の年齢を取得し、設定した後、再度取得しているだけです!
thisポインタがどちらであるかを検証するために、今度はadd_ageにブレークポイントを設定して実行すると、次のようになります:


コンパイラが自動的にA* constを付加しており、A const *thisではないことがわかります!
続いて、上述のコードにはconstな関数もありますので、get_ageにブレークポイントを設定すると、次のようになります:

コンパイラが上述のthisをconst A* constに変えていることがわかります。これは皆さんも予想できることです。この関数はconst関数であり、const関数はconst変数とconst関数にしかアクセスできず、他の変数の値を変更できません。そのため、変更できない変数を指すthis、すなわちconst A*が必要になり、さらにthis自体がconstポインタであるため、const A* constになるのです!
まとめ:thisはメンバ関数の実行開始前に構築され、メンバの実行終了後に破棄されます。上述のget_age関数はget_age(const A * const this)と解釈され、add_age関数はadd_age(A* const this,int a)と解釈されます。C++ではクラスと構造体の違いは1つだけです:クラスのメンバはデフォルトでprivate、構造体はpublicです。thisはクラスのポインタであり、構造体に置き換えれば、thisはその構造体のポインタになります。
関連トピック¶
- C++ 純粋仮想関数と抽象クラス | C++那些事
- C++ assert アサーション | C++那些事
- C++ ビットフィールド | C++那些事
- C 言語による C++ 多態の実現 | C++那些事
- C++ const 定数と修飾 | C++那些事
- C++ const ファミリー | C++那些事
- C++ 間接参照演算子 * | C++那些事
- C++ 初期化と代入 | C++那些事
- C++ 複数戻り値の書き方 | C++那些事
- C++ mutable キーワード | C++那些事