111
用const修饰的定义对象成为常对象;(两种声明方式)
1 const Point point1( 10,10);//常量对象 2 Point const point2( 10,10);//常量对象
用const修饰的声明成员函数成为常成员函数;
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修饰的声明数据成员成为常数据成员;
注意:变量或对象被const修饰后其值不能被更新(除非数据成员被mutable修饰时,可以被修改)。因此被const修饰的变量或者对象要进行初始化。
说明:
1 任何函数都不能对常数据成员赋值。
2 构造函数对常数据成员进行初始化时也只能通过初始化列表进行。
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类型的数据成员。