美文网首页C++ 杂记
条款 03:尽可能使用 const

条款 03:尽可能使用 const

作者: 赵者也 | 来源:发表于2017-07-18 10:41 被阅读16次

    Effective C++ 中文版 第三版》读书笔记

    条款03:尽可能使用 const

    面对指针:

    char myname[] = "toby";
    
    char* p = myname;          //< non-const pointer,non-const data
    
    const char* p = myname;    //< non-const pointer,const data
    
    char* const p = myname;    //< const pointer,non-const data
    
    const char* const p = myname; //< const pointer,const data
    

    const 语法虽然变化多样,但并非高深莫测。如果关键字 const 出现在星号左边,表示被指物是常量;如果出现在星号右边,表示指针自身是常量;如果出现在两边就都是常量。因为是以“星号”为界,所以 const char * 与 char const * 两种写法意义是相同的。

    STL 迭代器是以指针为依据定义出来的,所以迭代器的作用就像是 “T*” 指针。声明迭代器为 const 就像声明指针为 const 一样(即声明一个 T* const 指针),表示这个迭代器不得指向不同的东西,但其所指向的东西的值是可以改变的。如果希望迭代器所指向的东西的值不可以被改动(即希望 STL 模拟一个 const T* 指针),你需要的是 const_iterator,举例如下:

    std::vector<int> vec;
    ...
    const std::vector<int>::iterator iter = vec.begin();      //< iter的作用像一个T* const
    *iter = 10;       //< 改变所指之物,没问题
    ++iter;     //< 改变iter自身,错
    
    std::vector<int>::const_iterator cIter = vec.begin();     //< cIter的作用像const T*
    *cIter = 10;       //< 改变所指之物,错
    ++cIter;     //< 改变iter自身,没问题
    











    请记住:

    1. 将某些东西声明为 const 可帮助编译器侦测出错误用法。const 可被施加于任何作用域内的对象、函数参数、函数返回类型、成员函数本身
    2. 编译器强制实施 bitwise constness,但我们编写程序时应该使用“概念上的常量性”
    3. 当 const 和 non-const 成员函数有着实质等价的实现时,令 non-const 版本调用 const 版本可以避免代码重复

    相关文章

      网友评论

        本文标题:条款 03:尽可能使用 const

        本文链接:https://www.haomeiwen.com/subject/zqbckxtx.html