【Effective C++】3-尽可能使用const

const 的一件奇妙事情是,它允许你指定一个语义约束(也就是指定一个“不该被改动”的对象),而编译器会强制实施这项约束。它允许你告诉编译器和其他程序员某值应该保持不变。只要这(某值保持不变)是事实,你就该确实说出来,因为说出来可以获得编译器的帮助,确保这条约束不被违反。关键字const多才多艺。你可以用它在classes外部修饰global或namespace(见条款2)作用域中的常量,或修饰文件、函数、或区块作用域(block scope)中被声明为static的对象。你也可以用它修饰classes内部的static和non-static成员变量。面对指针,你也可以指出指针自身、指针所指物,或两者都(或都不)是const:

 char greeting[] = "Hello";       
 char* p = greeting;             // non-const pointer,non-const data     
 const char* p = greeting;       // non-const pointer,const data
 char* const p = greeting;       // const pointer,non-const data
 const char* const p = greeting; // const pointer,const data

const 语法虽然变化多端,但并不莫测高深。如果关键字 const出现在星号左边,表示被指物是常量;如果出现在星号右边,表示指针自身是常量;如果出现在星号两边,表示被指物和指针两者都是常量。如果被指物是常量,有些程序员会将关键字const写在类型之前,有些人会把它写在类型之后、星号之前。两种写法的意义相同,所以下列两个函数接受的参数类型是一样的:

 void f1(const Widget* pw);  // f1获得一个指针,指向一个常量的不变的Widget对象
 void f2(Widget const * pw); // f2也是

两种形式都有人用,你应该试着习惯它们。STL迭代器系以指针为根据塑模出来,所以迭代器的作用就像个T*指针。声明迭代器为const就像声明指针为const一样(即声明一个T*const指针),表示这个迭代器不得指向不同的东西,但它所指的东西的值是可以改动的。如果你希望迭代器所指的东西不可被改动(即希望STL模拟一个const T*指针),你需要的是const_iterator:

猜你喜欢

转载自blog.csdn.net/Edidaughter/article/details/121727452
今日推荐