1.定义变量时使用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出现在星号左边,表示被指物为常量;如果出现在星号右边,表示指针自身是常量;如果出现在星号两边,表示被指物和指针都是常量。
2.STL迭代器的const使用
声明迭代器为const 就像声明指针为const一样(即T* const指针),如果希望迭代器所指向的东西不可改动,我们需要const_iterator;
std::vector<int>vec;
const std::vector<int>iterator iter=vec.begin();//iter的作用像个T* const
*iter=10;//没问题,改变iter所指物
++iter;//错误!iter是const
std::vector<int>::const_iterator cIter=vec.begin();//cIter的作用像个const T*
*cIter=10;//错误,*cIter是const
++cIter;//没问题,改变cIter.
3.另返回值为一个常量
为避免如下错误的产生:
(a*b)=c;
if(a*b=c);
如果返回值为常量,则上述两种错误都能检测出来
4.const成员函数
成员函数如果是const意味着该函数不可以改变任何对象内,任何non-static成员变量(bitwise阵营的人相信)。
必须得改变怎么办?
利用C++的一个与const相关的摆动场:mutable(可变的)。mutable释放掉non-static成员变量的bitwise constness约束;
5.在const和non-const成员中避免重复
一般我们对operator[]的实现会有两个版本一个是常量版本,一个是非常亮版本,常量版本专门对常量进行处理,非常亮对非常量进行处理,因为非常量版本不能保证不修改常量所以是不能对常量进行处理的,但是这两种实现的大部分代码会发生重合,这时我们该怎么办呢?
class K
{
public:
...
const char& operator[](std::size_t position) const
{
...
...
...
return text[position];
}
char& operator[](std::size_t position)
{
return
const_cast<char&>(static_cast<const K&>(*this)[position]);
}
}
以上的套路很简单,就是先强制给对象加上const属性然后调用const版本的[]然后将返回值强制转换成非const版本,这样就避免代码重复了。