【8】C++のthisポインタを学ぶ
8313 ワード
クラスを学ぶとき、私たちは1つの状況を考慮することができます.
だからこのように書くのは間違いで、もちろん私たちはその中の1つのlenを修正することができて、例えばm_に修正することができますlen.
もちろん人の頭の鉄は、変数の名前を変えたくないので、この時はthisポインタが登場する必要があります.
ここでthisポインタは、実際にはメンバー関数のパラメータであり、メンバー関数を呼び出すときにオブジェクトのアドレスを実パラメータとしてthisに渡すため、この問題を完璧に解決します.しかし、thisというパラメータは暗黙的で、コードには表示されず、コンパイルフェーズでコンパイラによってパラメータリストに黙々と追加されます.thisは暗黙的パラメータとして本質的にメンバー関数のローカル変数であるため、メンバー関数の内部でのみ使用でき、オブジェクトを介してメンバー関数を呼び出す場合にのみthisに値を付与します.
このポインタにはいくつかの注意事項があります. thisはconstポインタであり、その値は変更できません.このポインタを変更しようとするすべての操作、例えば、付与、増分、減算などは許可されません. thisはメンバー関数の内部でしか使用できず、他の場所で使用するのは意味がなく、不法です. は、オブジェクトが作成された場合にのみ意味があるため、staticメンバー関数では使用できません.
thisポインタの騒々しい使い方について:
出力結果:
len = 10len = 5len = 10
1番目と3番目のprintInfoは10を出力し、2番目のprintInfoは5を出力します.通常、3番目のprintInfoは5を出力するべきです.これはprintInfoが最後に戻ったのはarr 1ではなく、別のオブジェクトなので、参照を使用してこのような状況を避けることができます.
これで出力が正常になります.しかし、なぜ1つ目の引用のない書き方で2つ目のprintInfoが出力されるのが普通なのか、これもよくわかりませんが、私はその後の勉強で原因を見つけたら、このエッセイを変更して、どなたか分かる方がいらっしゃいましたら、伝言をお願いします.
転載先:https://www.cnblogs.com/H2Rain/p/10827296.html
class Array
{
public:
Array(int len);
~Array();
void setLen(int len)
{
len=len;// , len len, len,
};
int getLen()
{
return len;
};
void printInfo()
{
cout<<"len = "<<len;
};
private:
int len;
}
だからこのように書くのは間違いで、もちろん私たちはその中の1つのlenを修正することができて、例えばm_に修正することができますlen.
もちろん人の頭の鉄は、変数の名前を変えたくないので、この時はthisポインタが登場する必要があります.
class Array
{
public:
Array(int len)
{
this->len=len;
};
~Array();
void setLen(int len)
{
this->len=len;
};
int getLen()
{
renturn len;
};
void printInfo()
{
cout<<"len = "<<len;
};
private:
int len;
}
ここでthisポインタは、実際にはメンバー関数のパラメータであり、メンバー関数を呼び出すときにオブジェクトのアドレスを実パラメータとしてthisに渡すため、この問題を完璧に解決します.しかし、thisというパラメータは暗黙的で、コードには表示されず、コンパイルフェーズでコンパイラによってパラメータリストに黙々と追加されます.thisは暗黙的パラメータとして本質的にメンバー関数のローカル変数であるため、メンバー関数の内部でのみ使用でき、オブジェクトを介してメンバー関数を呼び出す場合にのみthisに値を付与します.
このポインタにはいくつかの注意事項があります.
thisポインタの騒々しい使い方について:
#include
using namespace std;
class Array
{
public:
Array(int len)
{
this->len = len;
};
~Array() {};
Array setLen(int len)
{
this->len = len;
return *this;
};
int getLen()
{
return len;
};
Array printInfo()
{
cout << "len = " << len << endl;
return *this;
};
private:
int len;
};
int main()
{
Array arr1(10);
arr1.printInfo().setLen(5).printInfo();// ,
cout << "len = " << arr1.getLen() << endl;
return 0;
}
出力結果:
len = 10len = 5len = 10
1番目と3番目のprintInfoは10を出力し、2番目のprintInfoは5を出力します.通常、3番目のprintInfoは5を出力するべきです.これはprintInfoが最後に戻ったのはarr 1ではなく、別のオブジェクトなので、参照を使用してこのような状況を避けることができます.
#include
using namespace std;
class Array
{
public:
Array(int len)
{
this->len = len;
};
~Array() {};
Array setLen(int len)
{
this->len = len;
return *this;
};
int getLen()
{
return len;
};
Array& printInfo()// , arr1
{
cout << "len = " << len << endl;
return *this;
};
private:
int len;
};
int main()
{
Array arr1(10);
arr1.printInfo().setLen(5).printInfo();
cout << "len = " << arr1.getLen() << endl;
return 0;
}
これで出力が正常になります.しかし、なぜ1つ目の引用のない書き方で2つ目のprintInfoが出力されるのが普通なのか、これもよくわかりませんが、私はその後の勉強で原因を見つけたら、このエッセイを変更して、どなたか分かる方がいらっしゃいましたら、伝言をお願いします.
転載先:https://www.cnblogs.com/H2Rain/p/10827296.html