条款03:尽可能使用const

const与指针

  • 出现在星号左边:被指物是常量
  • 出现在星号右边:指针自身是常量

被指物是常量时,const写在类型前或类型后都行

const Widget* buf;
Widget const* buf;

const与迭代器

STL迭代器是以指针为根据塑模出来,所以迭代器的作用就像个T*指针

  • 迭代器不得指向不同的东西,需要为迭代器添加const关键字;
  • 迭代器所指的东西不可被改变,需要使用const_iterator;
std::vector<int> v;
const std::vector<int>::iterator it = v.begin();
*it = 10; //正确, 改变it所指物
++it; //错误, it是const
std::vector<int>::const_iterator cit = v.cbegin();
*cit = 10;//错误
++cit;//正确

const与函数声明

函数返回值与形参

防止参数被修改,预防“没意义的赋值动作”

const成员函数

确保该成员函数可以作用于const对象

const成员函数的重要性:

  • 区分哪个函数可以改动对象内容而哪个函数不行
  • 使“操作const对象”称为可能
    传递对象的高效方法是pass by reference-to-const方式

C++重要特性:
两个成员函数如果只是常量性不同,可以被重载。

void print(const TextBlock& ctb)
{
	std::cout << ctb[0];  //ctb是const,调用const TextBlock::operator[]
	...
}

C/C++特性:
如果函数的返回类型是个内置类型,那么改动函数返回值不合法。
纵使合法,by value返回对象意味着改动的其实是返回对象的一个副本,没意义。

const成员函数的相关难题:

问题1:我们知道,所有编译器都强制实施bitwise constness,如果我想在const成员函数内修改non-static成员变量该怎么做?
解决方法:
利用mutable可以释放掉non-static成员变量的bitwise constness约束;

mutable  std::size_t textLenght;//这些成员变量可能总是会被更改
mutable bool lengthIsValid;//即使在const成员函数内

问题2:当const和non-const成员函数有着实质等价的实现时,代码量很大的情况下,应该如何避免代码重复?
解决方法:令non-const版本调用const版本即可。

char& operator[](std::size_t position)
{
	return const_cast<char&>(static_cast<const TextBlock&>(*this)[position]);
}
  • static_cast将*this从原始类型TextBlock&转型为const TextBlock&(调用const op[]);
  • const_cast从const operator[]的返回值中移除const;

反向做法不行,const成员函数调用non-const成员函数是一种错误行为。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值