C++箴言:只要可能就用const
关键字const是非常通用的。在类之外,可以将它用于空之间的全局常量或命名常量,就像那些在文件、函数或模块范围内声明为静态的对象一样。在类内部,您可以将它用于静态和非静态数据成员。对于指针,可以指定指针本身是const,或者它指向的数据是const,或者两者都是,或者都不是。
char greeting[]= " Hello ";
char *p =问候语;//非常数指针,
//非常数数据
const char * p = greeting//非常数指针,
//常量数据
char * const p = greeting//常量指针,
//非常数数据
const char * const p = greeting//常量指针,
//常量数据
这个语法本身并不像看起来那么反复无常。如果const出现在*的左边,指针指向的内容是常量;如果const出现在*的右边,指针本身就是常量;如果const出现在*的两边,那么两者都是常数。
当指针指向一个常量时,有的人把const放在类型之前,有的人把const放在类型之前的*之后。这两者在意义上没有区别,因此以下两个函数具有相同的参数类型:
void f1(const Widget * pw);// f1接受一个指向
//常量小部件对象
void F2(Widget const * pw);//F2也是如此
因为它们都存在于实际代码中,所以您应该习惯这两种形式。
STL迭代器是基于指针的,所以迭代器的行为非常类似于T*指针。将迭代器声明为const类似于将指针声明为const(即声明T* const指针):不能将迭代器指向不同的东西,但是它所指向的东西可以改变自己。如果希望迭代器指向不能改变的东西(即const T*的STL等价物),应该使用const _ iterator:
STD::vector vec;
...
const STD::vector::iterator ITER =//ITER的行为类似于T* const
vec . begin();
* iter = 10//好,更改iter指向的内容
++ ITER;//错误!iter是常量
STD::vector::const _ iterator cIter =//cIter的行为类似于const T*
vec . begin();
* cIter = 10//错误!*cIter是常量
++ cIter;//好,更改cIter
位律师回复
0条评论