【8】C++のthisポインタを学ぶ

8313 ワード

クラスを学ぶとき、私たちは1つの状況を考慮することができます.
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はconstポインタであり、その値は変更できません.このポインタを変更しようとするすべての操作、例えば、付与、増分、減算などは許可されません.
  • thisはメンバー関数の内部でしか使用できず、他の場所で使用するのは意味がなく、不法です.
  • は、オブジェクトが作成された場合にのみ意味があるため、staticメンバー関数では使用できません.

  • 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