在C++中,若類的成員函數的形參列表之后緊跟著const關鍵字,則該成員函數為常量成員函數。如下:
struct Sales_data{ //數據成員 std::string bookNo; unsigned uints_sold = 0; double revenue = 0.0; //成員函數 std::string isbn() const { return bookNo; } //常量成員函數 Sales_data& combin(const Sales_data&);};當我們調用類的成員函數時,實際上是調用具體的某個對象的成員函數。成員函數是通過一個名為this的額外的隱式形參來調用它的那個對象。即當我們調用某個對象的成員函數時,會將this指針和該對象進行綁定。在成員函數內部,我們可以直接使用,并且能夠正確的使用調用該函數的對象的成員,而不用通過成員運算符來具體指定某個對象,就是因為this所指的正是這個對象。因為this的目的總是指向“這個”對象,故this是一個常量指針,不允許改變this保存的地址(它保存的地址正是“這個”對象的地址)。
成員函數中,形參列表后面的const關鍵字,作用是修改隱式this指針的類型。前面說this指針是常量指針,其保存的地址不能改變,即只能指向“這個”對象。但是如果該對象被聲明為常量對象,此時雖然this指針始終指向該常量對象,但是this卻并不是一個指向常量的指針,它只是一個常量指針。換句話說,允許通過this指針來改變這個常量對象,豈不是有問題了?
這就意味著,我們不能調用一個常量對象的普通函數。因為這意味著將普通函數的隱式this常量指針,跟一個常量對象進行綁定。關鍵字const的作用就是將this指針由常量指針改為指向常量對象的常量指針。如此,可以被常量對象所調用。
由上面分析可以知道:
(1)常量成員函數形參列表后的const關鍵字,意味著this指針指向常量。
(2)常量成員函數不會改變調用它的對象(因為this指針已經被改為指向常量的指針)
(3)非常量對象可以調用常量成員函數,常量對象只能調用常量成員函數不能調用普通成員函數(即使該普通成員函數不改變調用它的對象)。
參考:《C++ PRimer》 第五版
新聞熱點
疑難解答
圖片精選