用const修飾的定義對象成爲常對象;(兩種聲明方式)函數
1 const Point point1( 10,10);//常量對象 2 Point const point2( 10,10);//常量對象
用const修飾的聲明成員函數成爲常成員函數;spa
1 class Point{ 2 int x, y; 3 public: 4 Point(int a, int b) { x=a; y=b;} 5 void MovePoint( int a, int b){ x+=a; y+=b;} 6 void print() const { cout<<"x="<<x<<"y="<<y<<endl;} 7 };
用const修飾的聲明數據成員成爲常數據成員;code
注意:變量或對象被const修飾後其值不能被更新(除非數據成員被mutable修飾時,能夠被修改)。所以被const修飾的變量或者對象要進行初始化。對象
說明:blog
1 任何函數都不能對常數據成員賦值。table
2 構造函數對常數據成員進行初始化時也只能經過初始化列表進行。class
3 常數據成員在定義時必須賦值或稱爲必須初始化。變量
4 若是累有多個默認構造函數必須都初始化常數據成員。權限
經過下面例子來理解常數據成員:構造函數
1 class A{ 2 private: 3 int w,h; 4 const int cctwl=5; //錯誤一 5 public: 6 }; 7 void main(){ 8 A a ; //錯誤二 9 cout<< "sss"; 10 system("pause");}
錯誤一:不能對常數據成員在類中初始化、要經過類的構造函數,只有靜態常量才能這樣初始化。
錯誤二:沒有合適的默認構造函數可用。由於有常量cctwl沒有初始化必須初始化全部常數據成員。
多個構造函數下的常數據成員
class A{ private: int w,h; const int cctwl; public: const int cct; A():cctwl(5),cct(6){}; A(int x,int y) //錯誤一 { w=x,h=y; } }; void main() { A a ; A b(3,8); cout<< "sss"; system("pause"); }
錯誤一:每一個構造函數都要初始化常數據成員應改成
1 A(int x,int y):cctwl(7),cct(8) 2 { 3 w=x,h=y; 4 }
1 class Point{ 2 private: 3 int x, y; 4 const int e; 5 static int count; 6 public: 7 Point(int xx, int yy,int ee):e(ee),x(xx),y(yy) 8 { 9 count++; 10 } 11 void Show_C() 12 { 13 cout << "C = " << c << endl; 14 //cout << "D = " << d << endl; //這裏就已經沒有訪問權限了 15 } 16 static int Show_Count() 17 { 18 return count; 19 } 20 int c = 250; 21 const int d = 360; //能夠直接在聲明的時候賦值 22 }; 23
① 咱們能夠在定義const變量的時候直接對其進行賦值,賦值事後便沒法再對它進行各類"計算"操做;
② 若是不在定義的時候賦值,那就須要在該類的構造函數中使用初始化列表進行賦值(初始化):
在類的通常函數成員中依然能夠訪問const類型的數據成員。