真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

C++的this指針詳解-創(chuàng)新互聯(lián)

C++ 的 this 指針

thisC++中的一個關(guān)鍵字,也是一個const指針,它指向當(dāng)前對象地址(換句話說,其值為&object),通過它可以訪問當(dāng)前對象的所有成員。

成都創(chuàng)新互聯(lián)公司堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站建設(shè)、網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的鄂托克前網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!1. this 工作原理

我們知道類class是對象object的模板,所以在創(chuàng)建對象之前需要先定義類,類的定義包含屬性(變量)和方法的定義。

類定義好后我們就可以通過類來創(chuàng)建多個實例對象,每個對象都有各自的實例屬性(實例變量),但是非內(nèi)聯(lián)成員函數(shù)(non-inline member function)只會誕生一份函數(shù)實例(換句話說每個對象需要共用同一個方法來操作實例屬性)。在有多個實例對象訪問同一個函數(shù)時,函數(shù)如何知道該操作哪個對象的屬性?此時就需要this指針。

編譯器會隱式地傳遞this指針,this指針如同一個句柄,此時方法將根據(jù)句柄來確定需要操作哪個對象的屬性。調(diào)用靜態(tài)方法時,則不會隱式地傳遞this指針,因為靜態(tài)函數(shù)不與類實例對象相關(guān)聯(lián),即不屬于某個對象擁有而由所有實例對象共享。

2. 實例理解

現(xiàn)在我們通過結(jié)合程序來說明并理解上一節(jié)所描述的原理,這里我們定義了類Hello,其中包含三個實例屬性,以及一個使用屬性的方法setValue,以Hello為模板創(chuàng)建了三個對象object1, object2, object3

#includeusing std::cout;

class Hello {public:
    int a;
    int b;
    int c;

    Hello(int _a, int _b, int _c) {a = _a;
        b = _b;
        c = _c;
    }

    void setValue(int _a, int _b, int _c) {a = _a;
        b = _b;
        c = _c;
    }

    int getSum() {return (a + b + c);
    }
};

int main()
{Hello object1(10, 20, 30);
    Hello object2(20, 20, 10);
    Hello object3(10, 10, 10);

    cout<< "Hello";

    return 0;
}

將類Hello實例化時會根據(jù)類中定義的屬性來創(chuàng)建每個對象各自的屬性,確保各自數(shù)據(jù)完整性object1::(a, b, c),object2::(a, b, c),object3::(a, b, c)這一步就是將屬性存放至每個對象各自的內(nèi)存空間下。但是方法setValue則不會根據(jù)對象來創(chuàng)建多個,意味著object1,object2object3需要共用同一個方法setValue來修改他們的實例屬性。

為了保證方法setValue能夠修改對象對應(yīng)的屬性,編譯器隱式的向方法內(nèi)傳遞this指針,this指針指向的是當(dāng)前對象的地址(注意this是指針類型,在 C/C++ 中要用->運算符來訪問成員)。

#includeusing std::cout;

class Hello {public:
    int a;
    int b;
    int c;

    Hello(int _a, int _b, int _c) {this->a = _a;
        this->b = _b;
        this->c = _c;
    }

    void setValue(int _a, int _b, int _c) {this->a = _a;
        this->b = _b;
        this->c = _c;
    }

    int getSum() {return (this->a + this->b + this->c);
    }
};

int main()
{Hello object1(10, 20, 30);
    Hello object2(20, 20, 10);
    Hello object3(10, 10, 10);

    cout<< "Hello";

    return 0;
}

當(dāng)object1訪問setValuethis表示(Hello *)&object1,當(dāng)object2訪問setValuethis表示(Hello *)&object2,當(dāng)object3訪問setValuethis表示(Hello *)&object3,如下程序所示(注意:下面程序不能運行,只是用于說明this指針的本質(zhì)原理)。

#includeusing std::cout;

class Hello {public:
    int a;
    int b;
    int c;

    Hello(int _a, int _b, int _c) {((Hello*)&object1)->a = _a;
        ((Hello*)&object1)->b = _b;
        ((Hello*)&object1)->c = _c;
    }

    void setValue(int _a, int _b, int _c) {((Hello*)&object1)->a = _a;
        ((Hello*)&object1)->b = _b;
        ((Hello*)&object1)->c = _c;
    }

    int getSum() {return (((Hello*)&object1)->a + ((Hello*)&object1)->b + ((Hello*)&object1)->c);
    }
};

int main()
{Hello object1(10, 20, 30);
    Hello object2(20, 20, 10);
    Hello object3(10, 10, 10);

    cout<< "Hello";

    return 0;
}
3. this 使用場景

在一個對象的某個成員函數(shù)中需要返回對象本身時可以return *this;來將對象返回。

class Hello {public:
    int a;
    int b;
    int c;

    Hello & getObject() {return *this;
    }
};

當(dāng)對象的實例屬性與對象成員函數(shù)形參或局部變量相同時,如果需要訪問或給對象的實例屬性復(fù)制則需要使用this指針進行訪問this->a = a,否則a = a訪問的將是成員函數(shù)的形參或局部變量。

class Hello {public:
    int a;
    int b;
    int c;

    Hello(int a, int b, int c) {this->a = a;
        this->b = b;
        this->c = c;
    }
};

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧


本文標(biāo)題:C++的this指針詳解-創(chuàng)新互聯(lián)
鏈接分享:http://weahome.cn/article/cshopj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部