const修飾普通成員函數 我們知道this指針指向的是具體的對象,普通的成員函數存在(加深記憶),設計this指針的時候格式為*const this(常量指針)。 const修飾變數一般有兩種方式:const T *a,或者 T const *a,這兩者都是一樣的,主要看const位於*的左邊還是 ...
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 =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 =data; 27 cout<<"有參構造"<<endl; 28 } 29 Data(const Data &ob) 30 { 31 this->data = 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 =10000;//err const修飾函數 函數不能操作普通成員變數 cout<<this->data<<endl; //cout<<data<<endl; //mutable修飾的成員變數 可以修改 num = 200; } //編譯器認為 普通成員函數 存在修改成員變數 可能 void setData(int data) const { //this->data = data; return; } Data() { cout<<"無參構造"<<endl; } Data(int data) { this->data =data; cout<<"有參構造"<<endl; } Data(const Data &ob) { this->data = 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開闢空間