1. 程式人生 > 程式設計 >詳解C++中mutable的用法

詳解C++中mutable的用法

程式碼編譯執行環境: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的資料請關注我們其它相關文章!