まず、次のサンプルコードをお読みください。
class Date
{
public :
void Display ()
{
cout <<_year<< "-" <<_month << "-"<< _day <<endl;
}
void SetDate(int year , int month , int day)
{
_year = year;
_month = month;
_day = day;
}
private :
int _year ; // 年
int _month ; // 月
int _day ; // 日
};
int main()
{
Date d1, d2;
d1.SetDate(2021,3,19);
d2.SetDate(2020,3,19);
d1.Display();
d2.Display();
return 0;
}
考えてみてください:Dateクラスには2つのメンバー関数SetDateとDisplayがあります。関数本体の異なるオブジェクトの区別はありません。s1がSetDate関数を呼び出すと、関数
はどのようにしてs1オブジェクトの代わりにs1オブジェクトを設定する必要があるかを認識します。 s2オブジェクト?
C ++は、このポインターを導入することでこの問題を解決します。つまり、C ++コンパイラーは、各「非静的メンバー関数」に非表示のポインターパラメーターを追加して、ポインターが現在のオブジェクト(関数のときに関数を呼び出すオブジェクト)を指すようにします。が実行中)、関数本体のすべてのメンバー変数操作は、このポインターを介してアクセスされます。すべての操作がユーザーに対して透過的であるというだけです。つまり、ユーザーはそれを渡す必要がなく、コンパイラーが自動的に完了します。
アイコン:
このポインタの性質:
- このポインタのタイプ:クラスタイプ* const
- 「メンバー関数」内でのみ使用できます
- thisポインタは、実際にはメンバー関数の仮パラメータです。オブジェクトがメンバー関数を呼び出すと、オブジェクトアドレスが実際の
パラメータとしてthisパラメータに渡されます。したがって、このポインタはオブジェクトに格納されません。 - このポインターは、暗黙の関数ポインターパラメーターの最初のメンバーであり、通常、コンパイラーによってecxレジスターを自動的に通過します。ユーザーは、
渡す必要はありません。