条款三:尽可能使用const(use const whenever possible)const允许你指定一个语义约束,而编译器会强制实施这项约束。它允许你告诉编译器和其他程序员某值应该保持不变。有一条约束需要注意,那就是:如果const出现在*号的左边,那就是说被指物是常量;如果出现在星号右边,则表示指针本身是常量;如果出现在两边,则被指物和指针都是常量。如果被指物是常量,则关键字const写在类型的前面和类型之后,星号之前两种所表示的语义是相同的。例如下面这两种写法是一样的:void f1(const Widget* pw);void f2(Widget const * pw);const也可用来修饰STL中的迭代器。声明迭代器为const就想声明指针为const一样(即T* const 指针),表示这个迭代器不得指向不同的东西。但它所指的东西的值是可以改变的。如果希望迭代器所指的东西不可改变(即模拟一个const T*指针),需要的是const_iterator:std::vector<int> vec;...const std::vector<int>::iterator iter = vec.begin();// same as T* const*iter = 10; //no problem++iter; //wrong!!std::vector<int>::const_iterator cIter = vec.begin();//same as const T**iter = 10; //wrong!!++iter; //no problem
const 最具威力(?)的用法是面对函数声明时的应用。在一个函数声明式内,const可以和函数返回值,各参数,函数自身(成员函数)产生关联。令函数返回一个常量值,往往可以降低因客户错误而造成的意外,而又不至于放弃安全性和高效性。例如,考虑有理数的operator*声明式:class Rational(){...};const Rational operator* (const Rational & lhs, const Rational & rhs);也许你会说为什么返回一个const对象?原因是如果不这样别人可能实现这样的暴行:Rational a,b,c;...(a*b)=c;下面,主要说明const作用于成员函数。许多人都忽视了这么一个事实,那就是如果两个成员函数只是常量性不同,那么他们是可以重载的。考虑以下这个用来表示一大块文字的class:
Things to Remember
Declaring something const helps compilers detect usage errors. const can be applied to objects at any scope, to function parameters and return types, and to member functions as a whole.
Compilers enforce bitwise constness, but you should program using conceptual constness.
When const and non-const member functions have essentially identical implementations, code duplication can be avoided by having the non-const version call the const version.
posted on 2008-12-09 23:00 Edmund 阅读(228) 评论(0) 编辑 收藏 引用
Powered by: C++博客 Copyright © Edmund