const限定符在不同位置修饰的量是不同的。在C++中:
1.vector中iterator(就远原则)
1)vector<int>::const_iterator
表示vector中量均为const,不能被修改,但iterator可以被修改;
2)const vector<int>::iterator
表示iterator为const,iterator本身不能被修改,但可以通过其修改vector中的值。
2. const和指针(就近原则)
1)指向const对象的指针:const double *cptr;
表示cptr为一个指向double类型的const对象的指针,const限定了cptr指针所指向的对象类型,并非cptr本身,即cptr本身并不是const,在定义时不需要对它进行初始化,一经定义就不允许修改其指向对象的值,但该对象并非一定为const(见4);
2)const指针:本身的值不能修改,意味着一经定义不能指向其他对象
int errNum = 0;
int *const curErr = &errNum; //curErr is a const pointer
3)必须由const指针才能指向const对象,void指针也不类外
const double pi = 3.14;
double *ptr = &pi; //error
const double *cptr = π //ok
4)允许把非const对象的地址赋给指向const对象的指针
double dval = 3.14;
const double *cptr;
cptr = &dval;
*cptr = 3.14; //error
double *ptr = &dval;
*ptr = 3.14; //ok
double *cptr;
5)指向const对象的const指针
const double pi = 3.14;
const double *const pi = &pi; //值都不能修改
6)const 和 typedef
typedef string *pstring;
const pstring cstr;
等价于:
string *const cstr;
也等价于:
pstring const cstr;