- 1
- 0
- 约1.25万字
- 约 10页
- 2018-03-26 发布于河南
- 举报
C 箴言:只要可能就用const
C++箴言:只要可能就用const
关于const 的一件美妙的事情是它允许你指定一种语义上的约束:一个特定的对象不应该被
修改。而编译器将执行这一约束。它允许你通知编译器和其他程序员,某个值应该保持不变。
如果确实如此,你就应该明确地表示出来,因为这样一来,你就可以谋取编译器的帮助,确
定这个值不会被改变。
关键字const 非常多才多艺。在类的外部,你可以将它用于全局常量或命名空间常量,
就像那些在文件、函数或模块范围内被声明为 static 的对象。在类的内部,你可以将它用
于 static 和 non-static 数据成员上。对于指针,你可以指定这个指针本身是 const,或
者它所指向的数据是 const,或者两者都是,或者都不是。
chargreeting[] = Hello;
char*p= greeting;// non-const pointer,
// non-constdata
constchar*p = greeting; // non-const pointer,
// constdata
char* constp = greeting; // constpointer,
// non-constdata
constchar* constp= greeting;// constpointer,
// constdata
这样的语法本身其实并不像表面上那样反复无常。如果 const 出现在 * 左边,则指针
指向的内容为常量;如果 const 出现在 * 右边,则指针自身为常量;如果 const 出现在 *
两边,则两者都为常量。
当指针指向的内容为常量时,一些人将 const 放在类型之前,另一些人将 const 放在
类型之后 * 之前。两者在意义上并没有区别,所以,如下两个函数具有相同的参数类型:
voidf1(constWidget*pw);// f1takesapointertoa
// constant Widget object
void f2(Widgetconst *pw); // sodoesf2
因为它们都存在于实际的代码中,你应该习惯于这两种形式。
STLiterators 以指针为原型,所以一个 iterator 在行为上非常类似于一个 T* 指针。声
明一个 iterator 为 const 就类似于声明一个指针为 const(也就是说声明一个 T*const 指
针):不能将 iterator 指向另外一件不同的东西,但是它所指向的东西本身可以变化。如果
你要一个 iterator 指向一个不能变化的东西(也就是 constT* 的 STL 对等物),你应该用
const_iterator:
std::vectorint vec;
...
conststd::vectorint::iteratoriter= // iteractslike aT* const
vec.begin();
*iter= 10;// OK, changeswhat iterpointsto
++iter; // error! iteris const
std::vectorint::const_iteratorcIter= //cIteractslike a const T*
vec.begin();
*cIter= 10;// error! *cIteris const
++cIter; // fine,changescIter
对 const 最强有力的用法来自于它在函数声明中的应用。在一个函数声明中,const 既
可以用在函数返回值上,也可以用在个别的参数上,对于成员函数,还可以用于整个函数。
一个函数返回一个常量,常常可以在不放
原创力文档

文档评论(0)