条款03:尽可能的使用const

来源:互联网 发布:vb循环语句 编辑:程序博客网 时间:2024/04/28 02:05
1. //重载operator[]并对不同版本给予不同的返回类型;class TextBlock { public:    const char& operator[](std::size_t position) const {        return text[position];    }    char& operator[](std::size_t position) {        return text[position];    }private:    std::string text;}; void Print(const TextBlock& ctb) {    std::cout << ctb[0];}2.#include <iostream>// 尝试non-const 中返回类型不是reference to char 而是 char// 然后尝试 tb[0] = 'x';class TextBlock {public:    TextBlock(std::string s) {        text = s;    }    const char& operator[](std::size_t position) const {        return text[position];    }    char operator[](std::size_t position) {        return text[position];    }private:    std::string text;};void test()  {    TextBlock tb("Hello");    tb[0] = 'x'; // |error: lvalue required as left operand of assignment|}3.class TextBlock {public:    char& operator[](std::size_t position) const {   // error: invalid initialization of reference of type 'char&' from expression of type 'const char'|        return text[position];    }private:    std::string text;};但是class TextBlock {public:    char& operator[](std::size_t position) const {        return text[position];    }    private:    char* text;};/*能通过编译:原因是第二种情况中 const修饰的对象不能变的成员是 text指针,而不是指针中的内容;*/4.class CTextBlock {public:    CTextBlock(const char* s) {        strcpy(pText, s);    }    char& operator[](std::size_t position) const {        return pText[position];    }private:    char* pText;};void test() {    const CTextBlock cctb("Hello");    char* pc = &cctb[0]; // 因为返回的是 non-const char& 所以可以值赋给指针变量,并且内容可修改    *pc = 'J';}5. 使用概念上的常量性class CTextBlock {public:    CTextBlock(const char* s) {        strcpy(pText, s);    }    char& operator[](std::size_t position) const {        return pText[position];    }    std::size_t length() const;private:    char* pText;    mutable std::size_t text_length; //     mutable bool length_is_valid;   // mutable 修饰说明其非常量};std::size_t CTextBlock::length() const {    if (!length_is_valid) {        text_length = std::strlen(pText);        length_is_valid = true;    }    return text_length;}6.在const 和 non-const 成员函数中避免重复class CTextBlock {public:    CTextBlock(std::string s) {        text = s;    }    const char& operator[](std::size_t position) const {        return text[position];    }    char& operator[](std::size_t position) {        return            const_cast<char&> (                static_cast<const CTextBlock&>(*this)                    [position]            );    }private:    std::string text;};