栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

const理解-EffectiveCpp阅读总结

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

const理解-EffectiveCpp阅读总结

尽量使用const
  • 1 const和星号位置关系:
  • 2 const利于编译器侦测错误用法
  • 3 编译器强制实行bitwise constness, 编程时因使用conceptual constness
  • 4 减少代码重复

1 const和星号位置关系:

星号左侧:被指物为const
星号右侧:指针本身为const

STL迭代器以指针为依据塑造,迭代器作用类似T*指针
const iterator不能改变指针自身,但可改变所指内容,类似T* const
const_iterator类似const T*,被指物为常量,指针自身可改变

vector vec;
const vector::iterator iter=vec.begin(); //类似T* const,不能改变指针本身,但可以改变指针所指内容
*iter=10; //right
++iter; //wrong

vector::const_iterator cIter=vec.begin(); //类似const T*,被指物为常量,指针自身可改变
*cIter=10;
++cIter;
2 const利于编译器侦测错误用法

例如手滑将==打成=

3 编译器强制实行bitwise constness, 编程时因使用conceptual constness
  1. bitwise constness:又称physical constness, 必须不改变对象任何成员变量才行(static除外)
    优点:编译器易于侦测违反点,只需找成员变量赋值操作
    缺点:如果一个指针隶属于某个对象,改变指针所指物体依旧能通过bitwise constness测试
  2. conceptual constness:又称logical constness,const成员函数在客户端侦测不出时,可以改变处理对象内某些bit
    mutable关键字:释放掉non-static成员变量的bitwise constness约束
4 减少代码重复

当const和non-const成员函数具实质等价的实现时,令non-const调用const版本可避免代码重复

常量性转除, casting away constness

class A
{
public:
    const int& operator[](int i) const{...}
    int& operator[](int i){...}
    //上述两者代码完全一致
}

//优化:
const int& operator[](int i) const{...}//不改变
int &operator[](int i){
    return
        const_cast(
            static_cast(*this)[position]
        );
}

优化分为三步:

  1. static_cast转化为const
  2. 调用const版本operator[]
  3. const_cast去除const

反之不行,因为const成员函数承诺不改变对象的逻辑状态,但non-const未必;在const成员函数中调用non-const必然存在风险

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/316553.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号