C++ 常物件和常函式
常函式
在成員函式的宣告及定義的形參括號後邊加上const關鍵字,注意如果存在宣告的話,宣告和定義都必須加上const,這就叫常函式,常函式指的是常成員函式,沒有普通函式不能用const修飾。
class Person {
public:
void test() const;
};
void Person::test() const {
}
在設計類的時候,一個原則就是對於不改變資料成員的成員函式都要在後面加 const,而對於改變資料成員的成員函式不能加 const。所以 const 關鍵字對成員函式的行為作了更加明確的限定:
(1)有 const 修飾的成員函式(指 const 放在函式參數列的後面,而不是在函式前面或者參數列內),只能讀取資料成員,不能改變資料成員;沒有 const 修飾的成員函式,對資料成員則是可讀可寫的。
(2)除此之外,在類的成員函式後面加 const 還有什麼好處呢?那就是常量(即 const)物件可以呼叫 const 成員函式,而不能呼叫非const修飾的函式。
記住這幾條規則就夠用了:
- const物件只能呼叫const成員函式
- const成員函式只能呼叫const成員函式
- const成員函式中不能改變成員變數的值
- 存在宣告的話,宣告和定義都必須加上const
常函式機制探索
const本質上修飾的是this指標,網上很多這樣寫:
void print() const => const 類名 * const this,
實際上this指標本身就是const指標,即其值不可修改,也就是指向不可修改,並非const功勞,所以應該寫成:
void print() const => const 類名 * this,
所以const函式保證了this指向的物件是個常物件,導致我們無法修該物件的值。
值得注意的是,如果類中存在指標型別的資料成員即便是const函式只能保證不修改該指標的值,並不能保證不修改指標指向的物件。如:
class Name {
public:
void setName(const string &s) const;
private:
char *m_sName;
};
void setName(const string &s) const {
m_sName = s.c_str(); // 錯誤!不能修改m_sName;
for (int i = 0; i < s.size(); ++i)
m_sName[i] = s[i]; // 不好的風格,但不是錯誤的
}
常物件
const關鍵字能夠修飾物件,得到只讀物件,只讀物件只能呼叫const成員函式。
相關文章
- 重要內建函式、常見內建函式(瞭解)、可迭代物件、迭代器物件、for迴圈原理、異常捕獲函式物件
- C++常見函式的基礎演算法C++函式演算法
- python和Keras.backend常見函式PythonKeras函式
- 常見函式之單行函式函式
- c++一些常見的內建函式(字串)C++函式字串
- C++中函式指標與函式物件C++函式指標物件
- c++內建函式物件C++函式物件
- 65.C指標---sizeof()函式和strlen()函式常見考指標函式
- 關於C++中建構函式的常見疑問C++函式
- C++學習筆記(三):類與物件--靜態成員變數與常成員函式C++筆記物件變數函式
- C++ lambda 表示式與「函式物件」(functor)C++函式物件
- python常見內建函式Python函式
- 常見啟用函式的介紹和總結函式
- 【C++】 C++異常捕捉和處理C++
- JavaScript 五大常見函式JavaScript函式
- js常見函式總結(一)JS函式
- 使用python繪出常見函式Python函式
- 【SQL Server】常見系統函式SQLServer函式
- php常見的危險函式PHP函式
- PHP經常使用的字串函式PHP字串函式
- MySQL教程之常見函式(四)MySql函式
- js的函式和物件JS函式物件
- C++異常C++
- 詳解常見的損失函式函式
- Python常見工廠函式用法示例Python函式
- c++ 執行緒函式傳遞資料 物件和變數C++執行緒函式物件變數
- C++(STL原始碼):37---仿函式(函式物件)原始碼剖析C++原始碼函式物件
- <<從0到1學C++>> 第1篇 認識C++的函式和物件C++函式物件
- C++錯誤和異常處理C++
- 例項物件和函式物件的區別物件函式
- js變數與函式常識學習JS變數函式
- [C++] 成員函式指標和函式指標C++函式指標
- C++ 函式過載和模板C++函式
- 函式物件、物件、原型函式物件原型
- 統一返回物件和異常處理(二)物件
- 統一返回物件和異常處理(一)物件
- C++ 中的 const 物件與 const 成員函式C++物件函式
- Java異常十一:使用throw丟擲異常物件;throw和throws的區別Java物件