《Effective C++》条款03(尽可能的使用const)

条款03 尽可能的使用const

const出现形式
const关键字形式多种多样,对于普通变量的使用其规则就很多,如下图所示:
在这里插入图片描述
const关键字总结:const关键字出现在“ * ”号左边,表示被指对象为常量,如果const出现在“ * ”右边,表示指针自身为常量;如果const关键字即出现在“ * ”左边又出现在“ * ”右边,那么指针和被指对象都是常量。

如下表示的指针情况相同:
在这里插入图片描述
STL中的常量迭代器和指向常量的迭代器
形如指针和const结合一样,迭代器也有两种版本,分别是指向常量的迭代器和常量迭代器;
在这里插入图片描述返回常量的函数
返回常量的函数往往具有更高的安全性,这样客户不会因为误操作而产生损失。
在这里插入图片描述对于上述的“ * ”的重载,我们把返回值设置为const,因为我们不能保证用户不会做出这样的操作:
在这里插入图片描述
这种情况往往会发生在判断语句中,如果我们把if(a*b==c)误写为if(a*b=c),那么如果返回值为const,编译器将会为你找出错误。

const成员函数
对于const成员函数,我们不能在const函数的作用域内对任何类的成员做出修改,但是对于返回成员变量引用的const函数,我们是能够对他做出修改的。
在这里插入图片描述
对于重载版本的“ [ ] ”运算符,我们可以选择使用其不同版本,
在这里插入图片描述
对于ctb[0]=‘x’, 因为调用的版本返回的是引用,所以我们能够对做出修改,但是如果返回的值仅仅是 char 类型,我们将不能对齐做出如下修改:
在这里插入图片描述
因为 如果函数返回的是内置类型,那么改动函数的返回值是不合法的。

对于const成员函数,我们是能够通过返回值修改其值的。
在这里插入图片描述
对于这样一个返回引用的const成员函数,我们可以改变其返回值。
在这里插入图片描述
上述代码并不会报错,因为我们没在const函数的内部修改成员变量,我们仅仅通过他的返回值来进行修改。但其实这样的方式不适当。
因此,C++中的mutable关键字可以将变量声名为可修改的,这样声名的变量在const成员函数中依然能够对其进行修改。
在这里插入图片描述
采用mutable关键字后,可在const函数中完成修改成员变量。
在这里插入图片描述

const和非const成员函数中避免代码的重复。
在两个重载函数中,一个是const函数,而另一个是非const函数,而且两个版本的函数将要实现很多相同的功能,那么按照常规的方式进行组织代码,则会出现大量的代码的重复,如下:
在这里插入图片描述
这种大量代码的重复将会导致编译时间长、维护代码困难等各种问题,所以对于这种问题的解决一般是用一个函数调用另一个重载版本函数解决。在STL中的很多的运算符的重载都是采用这样的方式,比如后置的++运算符往往是通过调用前置的++运算符来实现的。
那么我们到底是应该用const版本的函数调用非const版本呢还是用非const版本调用const版本呢?因为非const版本函数是不能修改类的成员,所以当用const函数调用非const的成员函数时将会出现修改成员的风险 所以在实现中我们用非const版本的函数调用const版本的函数。上述的案例代码可以修改为如下:
在这里插入图片描述

上述的非const版本函数调用了const版本的函数,但是我们的运用了两只强制类型转换,const_cast 是用于将const对象的const属性抛弃的,这样我们的非const版本的函数的返回值就是非const的。我们的第二个强制类型转换为static_cast,在这他将一个非const对象加上const属性,static<const TextBlock&>(*this) [position]
表示将*this转换为一个const &的对象,然后调用const版本的操作运算符。如果这里直接用(*this)[position],那么该函数将会无限递归的调用非const版本的函数对于重载版本的函数c++语言优先选择精确匹配的函数调用。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值