const修飾普通成員函式
我們知道this指標指向的是具體的物件,普通的成員函式存在(加深記憶),設計this指標的時候格式為*const this(常量指標),
const修飾變數一般有兩種方式:const T *a,或者 T const *a,這兩者都是一樣的,主要看const位于*的左邊還是右邊,這里不再贅述,主要來看一下當const修飾類的成員函式時,成員函式有什么特點,
類的成員函式后面加 const ,表面這個函式不會對這個類物件的資料成員(準確的說是非靜態資料成員)作任何改變,
在設計類的時候,一個原則就是對于不改變資料成員的成員函式都要在后面加const,而對于改變資料成員的成員函式不能加const,所以const關鍵字對成員函式的行為作了更加明確的限定:
1.有const修飾的成員(指 const 放在函式引數表的后面,而不是在函式前面或者引數表內),只能讀取資料成員,不能改變資料成員;
2.在類的成員函式后面加 const 還有什么好處,那就是常量(即const)物件可以呼叫const成員函式,而不能呼叫非const 成員函式,
1 int myFun(void) const //const修飾的是成員函式 2 {}//函式內部不能修改 普通成員變數 mutable修飾時例外
1 class Data 2 { 3 private: 4 int data; 5 6 mutable int num; 7 public: 8 //遍歷 成員的函式 不會去修改成員的值 9 //如果函式不會更改成員資料 就讓編譯器知道 這是一個const函式 10 void myPrintData(void) const 11 { 12 //data =https://www.cnblogs.com/loliconinvincible/p/10000;//err const修飾函式 函式不能操作普通成員變數 13 cout<<this->data<<endl; 14 //cout<<data<<endl; 15 16 //mutable修飾的成員變數 可以修改 17 num = 200; 18 } 19 20 Data() 21 { 22 cout<<"無參構造"<<endl; 23 } 24 Data(int data) 25 { 26 this->data =https://www.cnblogs.com/loliconinvincible/p/data; 27 cout<<"有參構造"<<endl; 28 } 29 Data(const Data &ob) 30 { 31 this->data =https://www.cnblogs.com/loliconinvincible/p/ ob.data; 32 cout<<"拷貝構造"<<endl; 33 } 34 ~Data() 35 { 36 cout<<"解構式"<<endl; 37 } 38 }; 39 void test02() 40 { 41 Data ob1(100); 42 ob1.myPrintData(); 43 }
2、const修飾物件 叫常物件
class Data { private: int data; mutable int num; public: //遍歷 成員的函式 不會去修改成員的值 //如果函式不會更改成員資料 就讓編譯器知道 這是一個const函式 void myPrintData(void) const { //data =https://www.cnblogs.com/loliconinvincible/p/10000;//err const修飾函式 函式不能操作普通成員變數 cout<<this->data<<endl; //cout<<data<<endl; //mutable修飾的成員變數 可以修改 num = 200; } //編譯器認為 普通成員函式 存在修改成員變數 可能 void setData(int data) const { //this->data = https://www.cnblogs.com/loliconinvincible/p/data; return; } Data() { cout<<"無參構造"<<endl; } Data(int data) { this->data =https://www.cnblogs.com/loliconinvincible/p/data; cout<<"有參構造"<<endl; } Data(const Data &ob) { this->data =https://www.cnblogs.com/loliconinvincible/p/ ob.data; cout<<"拷貝構造"<<endl; } ~Data() { cout<<"解構式"<<endl; } }; void test03() { //常物件 const Data ob1(200); //常物件 只能呼叫const修飾的函式 遍歷成員資料 ob1.setData(20000); ob1.myPrintData(); }
總結:
1)const成員函式可以訪問非const物件的非const資料成員、const資料成員,也可以訪問const物件內的所有資料成員;
2)非const成員函式可以訪問非const物件的非const資料成員、const資料成員,但不可以訪問const物件的任意資料成員;
3)作為一種良好的編程風格,在宣告一個成員函式時,若該成員函式并不對資料成員進行修改操作,應盡可能將該成員函式宣告為const 成員函式,
4)如果只有const成員函式,非const物件是可以呼叫const成員函式的,當const版本和非const版本的成員函式同時出現時,非const物件呼叫非const成員函式,
const int num = 10;//系統不會給num開辟空間 num被放入符號表中 如果后期對&num 這時系統才會給num開辟空間轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/52944.html
標籤:C++
上一篇:標準輸入重定向到檔案后,如何連續讀入,如何判斷標準輸入流結尾?cin.eof();
下一篇:C++ 友元
