this
是C++
中的一個關(guān)鍵字,也是一個const
指針,它指向當(dāng)前對象地址(換句話說,其值為&object
),通過它可以訪問當(dāng)前對象的所有成員。
我們知道類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),即不屬于某個對象擁有而由所有實例對象共享。
現(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
,object2
,object3
需要共用同一個方法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
訪問setValue
時this
表示(Hello *)&object1
,當(dāng)object2
訪問setValue
時this
表示(Hello *)&object2
,當(dāng)object3
訪問setValue
時this
表示(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)查看詳情吧