const关键字为C++/C中的关键字,const修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的。这个常类型可以是指针,也可以是int等变量。
const的用法常见有以下四种:
const int n = 10;//限定整型变量n的值为10
const int *pt = &n;//限定pt指针的指向关系允许修改,当通过地址修改n值时不允许
int *const pt = &n;//限定pt指针的指向关系不允许修改,当通过地址修改n值时允许
const int *const pt = &n;//即限定指向关系,也限定指向n时只读
对于第一种用法我们不做讲解,我们来逐步演示后续几种const的作用:
int n = 10;
int* pt = &n;
cout << "n value:" << n << endl;
*pt = 20;
cout << "n value:" << n << endl;
步骤一:此时可以修改变量n的值,但是const 指针pt后,编译器提示错误:
int n = 10;
const int* pt = &n;
cout << "n value:" << n << endl;
*pt = 20;//const后,此操作错误
cout << "n value:" << n << endl;
步骤二:这是因为const指针pt后编译器讲不允许通过pt指针修改,但是可以通过其他指针修改,比如:
int n = 10;
const int* pt = &n;//限定指针
int* pm= &n;//限定指针
cout << "n value:" << n << endl;
*pm = 20;//可以通过其他指针修改
cout << "n value:" << n << endl;
步骤三:我们更进一步,讲const的用法高级一下:
int n = 10;
int* const pt = &n;
cout << "n value:" << n << endl;
*pt = 20;
cout << "n value:" << n << endl;
此时仍然可以修改n的值,这是为什莫呢?
因为步骤一、二中我们const限定的是*pt这个指针,但是此时我们限定的是pt的内存地址,而不是指针pt,只要在初始化时int* const pt = &n,那么就可以修改n的值。这里其实大家也就明白了,此时如果我们去修改pt内存地址,肯定是不允许的,比如;
int n = 10;
int m = 20;
int* const pt = &n;
cout << "n value:" << n << endl;
*pt = 20;
cout << "n value:" << n << endl;
pt = &m;//修改pt的内存地址是不允许的
到这里我们总结一下步骤一、二、三中的const的区别:
int* const pt = &n://只限定了指向关系,指向对象n时可以修改n
const int* pt = &n;//只限定了指向对象n时只读n,但是指向关系没有限定
最后,我们来看第四种用法,其实就是第二种和第三种用法累加:
int n = 10;
int m = 20;
const int* const pt = &n;
*pt = 20;//不可以修改n值
pt = &m;//不可以修改指向关系,也就是pt的地址值
cout << "n value:" << n << endl;
cout << "n value:" << *pt << endl;