【Effective C++】条款03:尽可能使用 const

结论

  1. 编译器强制实施 bitwise constness,但你编写程序时应该使用概念上的常量性。
  2. 当 const 和 non-const 成员函数有着实质等价的实现时,令 non-const 版本调用 const 版本可避免重复。

bitwise constness —— 不更改对象的任一bit

class CTextBlock {
public:
    ...
    char &operator[](std::size_t position) const {
        return pText[position];
    }

private:
    char *pText;
};

const CTextBlock cctb("Hello"); // 创建常量对象
char *pc = &cctb[0];            // 调用const成员函数 返回指向内容的指针
*pc = 'J';                      // 指针指向的值可以改变,与常量对象矛盾

logical constness

一个 const 成员函数可以修改它所处理的对象的某些 bits,但要保证在用户使用中侦测不出。

mutable 成员变量,即使在 const 成员函数内也可被修改。

指针的位置

  • const 在 * 左边,表示所指物是常量;
  • const 在 * 右边,表示指针是常量。

* 是 const (指针是常量)

迭代器

迭代器本身是 const

// 先初始化一个 vector
std::vector<int> my_vec = {0, 1, 2, 3, 4};

// 这里是一个const的迭代器,说明迭代器本身不可修改,但是指向的内容可以修改
const std::vector<int>::iterator iter = my_vec.begin();
cout << *iter << endl;
*iter = 10;
cout << *iter << endl;

// 下面的都通不过编译
// iter++;
// iter = my_vec.end();

迭代器指向的内容为 const

// 先初始化一个 vector
std::vector<int> my_vec = {0, 1, 2, 3, 4};

std::vector<int>::const_iterator c_iter;
c_iter = my_vec.begin();
cout << *c_iter << endl;

// 下面这句话通不过编译
// *c_iter = 20;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值