什么是顶层和底层const:
1. 顶层const:指const定义的变量本身是一个常量;
2. 底层const:指const定义的变量所指向的对象是一个常量;
const int i = 0; //顶层const,变量i就是常量; const int * a = &i; //底层const, a所指向的对象*a是常量; int * const b = &i; //顶层const, 变量b本身就是一个常量;
区分后有什么作用:
1. 对于函数重载,编译器在区分重载函数时会自动屏蔽顶层const;
void testfunc(int* a) { cout << "this is int* a" << endl; } void testfunc(const int* a) { cout << "this is const int* a" << endl; } void testfunc(int* const a) { cout << "this is const int* a" << endl; }
2.底层const变量不能赋值给非底层const的变量
int zz = 99; const int *xp = &zz;
//*xp = 88; //错误,*xp定义为const,不能被修改; //int * const xpp = xp; //错误, xp为底层const,不能赋值给非底层的const变量,即底层const变量只能赋值给底层的const变量; const int * cap = xp; //正确,cap为底层const,xp也有底层const;
3.const_cast强制类型转换函数,只能改变底层const变量的const属性;
const int zz = 99; const int *xp = &zz; int *ptr = const_cast<int*>(xp);//正确,底层cosnt变量能够使用const_cast进行类型转换 *ptr = 66; const int ca = 100; //int bb = const_cast<int>(ca); //错误,ca为顶层const,无法使用cosnt_cast进行强制类型转换;