成员函数前后添加const的区别
首先看以下例子:
class Rect{
public:
Rect();
~Rect();
size_t length() const; //在函数后添加const
const char* getContent(); //在函数前添加const
void setLengthValid(bool isLengthValid);
private:
char *pContent;
size_t contentLength; //A
bool lengthIsValid; //B
size_t precontentLength;
};
以上的例子中length()函数后添加了const关键字,而getContent前添加了const关键字,两个函数的具体实现如下:
Rect::Rect(){}
Rect::~Rect(){}
size_t Rect::length() const{
if(!lengthIsValid){
contentLength= strlen(pContent); //C
lengthIsValid = true; //D
}
return contentLength;
}
const char* Rect::getContent(){//函数名前加const
return pContent;
}
int main(){
Rect *rc =new Rect;
rc->setLengthValid(false);
rc->length();
char * content = rc->getContent(); //E
return 0;
}
通过运行main中的代码,我们得到了如下的错误:
我们不难看出,在length()函数中,C、D两处出现了错误,原因是:
- 函数后添加const关键字,表示函数内部的数是不允许的改变的,仅允许读;
- 上面的length函数可能会修改里面的contentLength和lengthIsValid的值,这样编译器肯定是不允许的;
而在getContent()函数中,出现错误的原因是:
- char*和const char*的转化出现问题;
- 函数前添加const关键字,表示表示数据不允许修改仅允许读出;
- main函数中,我们通过getContent得到的返回值是const char*,而声明的content为char*类型,属于可变变量;
- 要使得length函数中的错误得到修正且正确执行,可在变量前添加mutable关键字,表明该变量永远处于可变的状态,以此来突破const关键字的限制;
- 要使得main函数中类型转换得到正确执行,我们可以在content的声明更改成:const char*类型;