顶层const与底层const
①如果关键字出现在星号左边表明被指物是常量;如果星号出现在右边,表明指针自身是常量;如果出现在星号两边,表明被指物和指针都是常量
int i = 0 , j = 3 ;
float k= 1 ;
int * const p = &i;
p = &j;
const int *p1 = &i;
*p1 = j;
②声明迭代器为const就像声明指针为const一样,表明这个迭代器不得指向不同的东西,但所指东西的值可以改变。如果希望迭代器所指的东西不可改动,则是const_iterator。
vector <int > vec{ 1 ,2 ,3 ,4 ,5 };
const vector <int > ::iterator iter = vec.begin();
*iter = 10 ;
iter++;
vector <int > ::const_iterator cIter = vec.begin();
*cIter=10
③令函数返回一个常量值,可以降低客户错误而造成的意外,又不至于放弃安全性和高效性。
bitwise constness和logical constness
①bitwise constness阵营的人相信,成员函数只有在不更改对象之任何成员变量时才可以说是const。也就是说不更改对象内任何一个bit。但下面有个反例。
class CtextBlock
{
public :
CtextBlock (char *str)
{
pText = new char [100 ];
strcpy(pText, str);
}
char & operator [](size_t position) const
{
return pText[position];
}
private :
char *pText;
const CtextBlock cctb("hello" );
char *pc = &cctb[0 ];
*pc = 'J' ;
};
②logical constness阵营的人认为一个const函数可以修改它所处理对象内的某些bits,这个时候可以用mutable关键字。
class CTextBlock
{
public :
size_t length() const ;
private :
char * pText;
mutable size_t textLength;
mutable bool lengthIsValid;
};
size_t CTextBlock::length() const
{
if (!lengthIsValid)
{
textLength = strlen (pText);
lengthIsValid = true ;
}
return textLength;
}
当const和non-const成员函数有着实质的等价实现时,令non-const版本调用const版本可避免代码重复。反过来则不行