知识点 mutable
class CTextBlock {
public:
...
std::size_t length() const;
private:
char* pText;
std::size_t textLengeh; //最近一次计算的文本区块长度
bool lengthIsValid; // 目前的长度是否有效
};
std::size_t CTextBlock::length() const
{
if (!lengthIsValid) {
textLengeh = std::strlen(pText); //错误! 在const成员函数内
lengthIsValid = true; // 不能复制给textLength 和 lengthIsValid。
}
return textLengeh;
}
解决上述问题的方法很简单:利用C++的一个与const相关的摆动场:mutable(可变的)。mutable释放掉non-static成员变量的bitwist constness约束:
class CTextBlock {
public:
...
std::size_t length() const;
private:
char* pText;
mutable std::size_t textLength; //这些成员变量可能总是会被更改
mutable bool lengthIsValid; //及时在const成员函数内
};
std::size_t CTextBlock::length() const
{
if (!lengthIsValid) {
textLength = std::strlen(pText); //现在, 可以这样
lengthIsValid = true; //也可以这样
}
return textLength;
}
知识点
知识点
若要不想编译器自动生成default构造函数,copy构造函数,copy assignment操作符,只需要将这些函数声明成private,就可以了。