深刻懂得c++常成員函數和常對象。本站提示廣大學習愛好者:(深刻懂得c++常成員函數和常對象)文章只能為提供參考,不一定能成為您想要的結果。以下是深刻懂得c++常成員函數和常對象正文
先明白幾個概念:
1. 常對象只能挪用常成員函數。
2. 通俗對象可以挪用全體成員函數。
3. 當對一個對象挪用成員函數時,編譯法式先將對象的地址賦給this指針,然後挪用成員函數,每次成員函數存取數據成員時,由隱含應用this指針。
4. 當一個成員函數被挪用時,主動向它傳遞一個隱含的參數,該參數是一個指向這個成員函數地點的對象的指針。
5. 在C++中,this指針被隱含地聲明為: X *const this,這意味著不克不及給this 指針賦值;
在X類的const成員函數中,this指針的類型為:const X* const, 這解釋this指針所指向的這類對象是弗成修正的(即不克不及對這類對象的數據成員停止賦值操作);
6. 因為this其實不是一個慣例變量,所以,不克不及獲得this的地址。
如:
#include <iostream> class A { public: A():mValue(0) { } void print() { std::cout<<"hello"; } int GetValue() { return mValue; } int GetValue()const { return mValue; } private: int mValue; }; void test(A & const a) { } int main() { const A a;//const A* const this ; a.print(); //毛病,將會提醒 error C2662: “A::print”: 不克不及將“this”指針從“const A”轉換為“A &” test(a); //error C2664: “test”: 不克不及將參數 1 從“const A”轉換為“A &” }
因為a是const對象,所以a只能挪用類A中的常成員函數。
那末為何會提醒:“不克不及將this指針.......”的語句呢?
由於關於c++的成員函數(固然不是靜態成員函數),都邑含有一個隱蔽的參數,關於上例A中的int GetValue()函數,在編譯後會釀成:
int GetValue(A * const this); //不克不及修正this變量,但可以修正this指向的內容,即:this是常量指針。
而關於int GetValue()const ,編譯後是:
int GetValue(const A* const this);
只所以this指針是const類型,由於在某次挪用全部進程this指向都不許可轉變(緣由很簡略,假如轉變的話就不是這個對象挪用的了)
從編譯後的成果看就很清晰了, 由於a是const,所以其this指針就對應: const A* const this ;
而print函數被編譯出來後對應的是void print(A* const this); 在停止參數婚配時, 所以就會提醒 “不克不及將“this”指針從“const A ....."
this指針的湧現就說明了,一切類A的對象都是公用一套代碼模版,為何各個對象在挪用成員函數的時刻不會亂套。
本來C++為成員函數供給了一個名字為this的指針,這個指針稱為自援用指針。每當創立一個對象時,體系就把this指針初始化為指向該對象。每當挪用一個成員函數時,體系就主動把this指針作為一個隱含的參數傳給該函數。分歧的對象挪用統一個成員函數時,C++編譯器將依據成員函數this指針所指向的對象來肯定應當援用哪個對象的數據成員。平日情形下,this指針是隱含存在的,也能夠將其顯示的表現出來(即如上例中的 this->mValue。不外this指針只能在類中應用)
還有就是 this指針是一個const指針,不克不及再法式中修正它或給它賦值;
以上這篇深刻懂得c++常成員函數和常對象就是小編分享給年夜家的全體內容了,願望能給年夜家一個參考,也願望年夜家多多支撐。