Effective C++ 第三条,尽可能使用const

  • const可以修饰指针,也可以修饰指针所指物 , 指针用const修饰时,指针不能改变p3++非法,指针所指物用const修饰时指针所指物不能改变*p1 = 1非法。
    char str[] = "ni hao";
    char *p = str;    // 非常量指针,非常量数据
    const char *p1 = str; //非常量指针, 常量数据
    char const *p2 = str; // 等于上一个
    char *const p3 = str; // 常量指针, 非常量数据
    const char* const p4 = str; //常量指针,常量数据
  • STL迭代器就像指针T* 一样,声明const it就像声明指针为常量一样,T* const,所以it没法自增,改变所指物可以。
    std::vector<int> v(10,7);
    const std::vector<int>::iterator it = v.begin();
    *it = 10;  //通过编译
    ++it;      //非法
  • const可以修饰函数返回值,函数参数和(成员函数)函数自身。
class Rational
{...};
const Rational operator* (const Rational& num1, const Rational& num2);
  • 修饰成员函数时如果只是参数的常量性不同看可以被重载
class Text {
public:
    Text(const string &str)
        :text ( str)
    {}
    const char& operator [](size_t size)const 
    {
        return text[size]; 
    }

    char& operator [](size_t size) 
    {
        return text[size];
    }

private:
    std::string text;
};

int main()
{
    Text t("abcd");  
    const Text ct("abcd");
    return 0;
}
  • mutable(可变的)释放掉non-static成员变量的约束性,如果你想改变const成员函数的一部分
#include <iostream>
using namespace std;
#include <string>

class Text {
public:
    Text(const string &str, size_t len = 0)
        :text ( str)
        ,textlength(len)
    {}

    const char& textc()const
    {
        textlength > text.length();
        textlength = 0;   //这里可以改变
        return text[textlength];
    }

private:
    std::string text;
    mutable size_t textlength;  //可变的
};

int main()
{
    const Text ct("abcd",10);
    cout << ct.textc() << endl;
    system("pause");
    return 0;
}
  • 如果存在大量的no_const和const需要两个函数很造成很多的代码重复。用const函数调用非const函数是错误的,因为要通过编译需要将*this的常量性解放。 反向调用是安全的。
#include <iostream>
using namespace std;
#include <string>

class Text {
public:
    Text(const string &str)
        :text(str)
    {}
    const char& operator [](size_t size)const
    {
        return text[size];
    }

    char& operator [](size_t size)
    {
        return const_cast<char&>(static_cast<const Text&>(*this)[size]) ;
    }

private:
    std::string text;
};

int main()
{
    Text t("abcd");
    const Text ct("abcd");
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魏尔肖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值