记住:
const可被施加于任何作用域内的对象,函数参数,函数返回类型,成员函数体。
编译器强制实施bitwise constness,但编写程序时应该使用“概念上的常量性“。
当const和non-const成员函数有着等价实现时,令non-const版本调用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
std::vector<int> vec; const std::vector<int>::iterator iter = vec.begin(); *iter = 10; ++iter; //错误! iter是const std::vector<int>::const_iterator cIter = vec.begin(); *cIter = 10; //错误! *cIter是const ++cIter;
#include <string> using namespace std; class TextBlock { public: TextBlock(string str) : text(str) {} const char& operator[] (size_t position) const { return text[position]; } char & operator[] (size_t position) { return text[position]; } private: string text; }; int main() { TextBlock tb("hello"); cout << tb[0] << endl; //调用non-const TextBlock::operator[] const TextBlock ctb("world"); cout << ctb[0] << endl; //调用const TextBlock::operator[] }
mutable的成员变量即使在const成员函数内,也可以被改变
#include <iostream> #include <string> using namespace std; 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; }
避免重复代码
class TextBlock { public: const char& opertor[](size_t position) const { return text[position]; } char& operator[](size_t position) { return const_cast<char&>( static_cast<const TextBlock&>(*this)[position] ); } };