詳解C++中mutable的用法
阿新 • • 發佈:2020-08-16
程式碼編譯執行環境:VS2017+Win32+Debug
mutalbe的中文意思是“可變的,易變的”,是constant(即C++中的const)的反義詞。在C++中,mutable也是為了突破const的限制而設定的,被mutable修飾的變數將永遠處於可變的狀態。
mutable的作用有兩點:
(1)保持常量物件中大部分資料成員仍然是“只讀”的情況下,實現對個別資料成員的修改;
(2)使類的const函式可以修改物件的mutable資料成員。
使用mutable的注意事項:
(1)mutable只能作用於類的非靜態和非常量資料成員。
(2)在一個類中,應儘量或者不用mutable,大量使用mutable表示程式設計存在缺陷。
示例程式碼如下:
#include <iostream> using namespace std; //mutable int test;//編譯出錯 class Student { string name; mutable int getNum; //mutable const int test; //編譯出錯 //mutable static int static1;//編譯出錯 public: Student(char* name) { this->name=name; getNum=0; } string getName() const { ++getNum; return name; } void pintTimes() const { cout<<getNum<<endl; } }; int main(int argc,char* argv[]) { const Student s("張三"); cout<<s.getName().c_str()<<endl; s.pintTimes(); return 0; }
程式輸出結果:
張三
1
mutable不能修飾const資料成員容易理解,因為mutable與const本是反義,同時修飾不是自相矛盾嗎。mutable不能修飾static資料成員,因為static資料成員儲存在Data段或BSS段,屬於類,不屬於類物件,那麼常物件和常函式可以對其任意地修改,所以類的static資料成員根本不需要mutable的修飾,但對於常物件的資料成員則不可以被修改,若想修改,則需要mutable的修飾。示例程式碼如下:
#include <iostream> using namespace std; class Student { string name; public: static int test1; void modify() const { test1=15; cout<<test1<<endl; } }; int Student::test1;//申明test1並按照編譯器預設的值進行初始化 int main(int argc,char* argv[]) { const Student s("張三"); s.test1=5;//常物件可以修改靜態類的資料成員test1 cout<<Student::test1<<endl; s. modify();//常函式修改 return 0; }
程式輸出結果是:
5
15
以上就是詳解C++中mutable的用法的詳細內容,更多關於C++ mutable的資料請關注我們其它相關文章!