const 允許我們指定一個語義約束,使某個值應該保持不變
1、const 修飾 變量,指針,函數,函數返回值等,可以使程序減少錯誤,或者更容易檢測錯誤:
? ? ? ? 指針常量:int* const p;//指針地址不可變,指針指向值可變
? ? ? ? 常量指針:const int* p;//指針指向值不可變,指針地址可變
? ? ? ? 常量指針常量:const int* const p;//都不可變
const 修飾迭代器:
? ? ? ? iterator 相當于 T* const //指針常量
? ? ? ? const_iterator 相當于 const T* //常量指針
const 修飾函數返回值:
const int max(int a, int b)
{a > b ? a : b;
}int c = 6;
max(a,b) = c;
//將 c 的值賦給 max(a, b) 是沒有意義的,const 防止這種操作的發生
2、const 修飾成員函數
? ? ? ? 如果兩個成員函數只是常量性不同(其他相同)則可以發生重載
? ? ? ? ? ? ? ? const 類對象調用 const 成員函數
? ? ? ? ? ? ? ? non-const 類對象調用普通成員函數
bitwise:
? ? ? ? const 成員函數不能改變(除 static)成員變量的值,因為常函數里 this 指針指向的值不可改變。同理,const 對象不可以調用 non-const 函數,因為函數有能力更改成員屬性的值。
? ? ? ? 但是若成員變量是一個指針,僅僅改變指針指向的值卻不改變指針地址(地址是 this 指向的值),則不算是 const 函數 ,但能夠通過 bitwise 測試。
? ? ? ? 使用 mutable 可以消除 non-static 成員變量的 bitwise constness 約束。
class person
{
public:person(int a){m_id = a;}int& func() const{m_id = 888;}mutable int m_id;
};?int main()
{const person p(666);p.func();cout << p.m_id << endl;system("pause");return 0;
}
3、當 const 和 non-const 成員函數有實質的等價實現時,利用兩次轉型,令 non-const 調用 const 可以避免代碼重復。
const char& operator[](int pos) const
{//...//...return name[pos];
}char& operator[](int pos)
{returnconst_cast<char&>//移除第一次轉型添加的 const(static_cast<const classname>(*this)[pos]//把 classname 類型數據轉換為 const classname//使得能夠調用 const operator[]);
}
? ? ? ? ? ? ? ? ? ?
原文鏈接:https://blog.csdn.net/qq_62674741/article/details/124896986