effective c++ 条款03:尽可能使用const

记住:

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]
        );
    }
};

猜你喜欢

转载自www.cnblogs.com/pfsi/p/9160007.html
今日推荐