預設情況下,編譯器為類的每個成員函式提供了乙個隱式形參,該形參指向被呼叫的成員函式所在的物件。該隱式形參成為this。常量成員函式是乙個不會修改呼叫它的物件的函式。
1.this指標
隱式物件形參的實際形參就是呼叫成員函式的物件的位址。因此在類的成員函式中也可以通過使用( *this )表示式來訪問呼叫它的物件
。此外,也可以通過同乙個指標訪問該物件的任何成員
。示例**:
void example::setvalue(int x)
2.常量成員函式
通過引用或通過指標傳遞給函式的形參可能會被該函式修改。但是如果在形參中使用const關鍵字,則可以防止呼叫的函式修改它。例如:某個函式的宣告如下:
void fun(const string &str);
該函式採用了乙個字串物件的引用作為形參,但是不能修改該物件。有乙個類似的機制,可以用來保護隱含的形參*this,使它不會被成員函式修改。
當定義成員函式時,可以在形參列表後面防止const關鍵字,這實際上就是告訴編譯器,該成員函式未被允許修改其物件。如果成員函式定義在類的外面,則類內的宣告和類外的定義都必須具有const,示例:
class constexample
void setvalue(int);
int getvalue() const;
};getvalue函式定義語句應如下:
int constexample::getvalue() const
具有常量引數x的函式無法轉向,並將x作為非常量形參傳遞給另乙個函式。換句話說,承諾不修改x的函式不能將x傳遞給另乙個函式,除非第二個函式也承諾不修改x。這種情況下有時也可能會以不明顯的方式發生。以下程式使用帶有常量引數的函式來列印陣列的第乙個元素,但是它不會編譯,因為它在const的使用方面不一致:
#include
using namespace std;
class k
int main()
;outputfirst(arr);
return 0;
}執行顯示錯誤:
該程式之所以不能編譯,是因為編譯器不能保證const陣列的元素在作為隱含的this形參傳遞給output成員函式時,不會被修改。
要讓該程式可以編譯,則可以使output()成員函式變成乙個const成員函式,以表示它有乙個作為常量的this形參。
常量成員函式,指向this的指標
在類中,形如 test combine const test latter const 這樣的成員函式為常量成員函式。當test的物件呼叫combine函式時,隱式指標this會指向呼叫該函式的物件,this指標預設為常量指標,即test const型別,當該物件為常量物件時,this指標不能指向它...
關於C 中的常量成員函式
常量成員函式宣告 如 int get const 規則 1.常量成員函式不修改物件。2.常量成員函式在定義和宣告中都應加const限定 3.非常量成員函式不能被常量成員函式呼叫,但建構函式和析構函式除外。4.常量 const物件 物件只能呼叫常量成員函式。const物件的資料成員在物件壽命週期內不能...
C 常量成員函式的含義
在類x的非常量成員函式中,this指標的型別為x const。也就是說,它是指向非常量x的常量指標。而在類x的常量成員函式中,this的型別為const x const。也就是說,是指向常量x的常量指標。這就是常量成員函式和非常量成員函式的區別。對成員函式的this指標型別加上常量修飾符,就可以解釋...