zoukankan      html  css  js  c++  java
  • Effective C++ -----条款03:尽可能使用const

    如果关键字const出现在星号左边,表示被指物是常量;如果出现在星号右边,表示指针自身是常量;如果出现在星号两边,表示被指物和指针两者都是常量。

    char greeting[] = " hello";

    char* p = greeting;  //non-const pointer,non-const data

    const char* p = greeting;  //non-const pointer,const data  声明p为一个指向常量的greeting的指针,p指向的对象不能被修改,但他可以指向任何地址的常量

    char* const p = greeting; //const pointer,non-const data  声明p为一个常量指针,他指向greeting,p这个指针的指向不能被修改,但他指向的地址的内容可以修改。

    const char* const p = greeting; //const pointer,const data

    const std::vector<int>::iterator iter = vec.begin();//iter的作用像哥T* const

    *iter = 10;  //没问题,改变iter所指物  

    ++iter;//错误!iter是const

    std::vector<int>::const_iterator cIter = vec.begin();  //cIter的作用像哥const T*

    *iter = 10;  //错误!*cIter是const

    ++iter;//没问题,改变cIter

    在函数名返回值前加const,表明返回的是常量,不可以修改。在类成员函数最后加const,表明它不改变对象的成员变量,也不能调用类中任何非const成员函数。

    可以利用c++的一个与const相关的摆动场:mutable(可变的)。mutable释放掉non-static成员变量的bitwise constness(又称physical constness)约束。

    在const和non-const成员函数中避免重复

    class TextBlock

    {

    public:

         ...

         const char& operator[] (std::size_t position) const

      {

        .....

        return text[position];

      }

      char& operator[] (std::size_t position)

      {

        return 

          const_cast<char&>(static_cast<const TextBlock&>(*this)[position]);

      }

    ...

    };

    将某些东西声明为const可帮助编译器侦测出错误用法。const可被施加于任何作用域内的对象、函数参数、函数返回类型、成员函数本体。

    编译器强制实施bitwise constness,但你编写程序时应该使用“概念上的常量性”(conceptual constness)。(就是使用mutable释放bitwise constness)

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

  • 相关阅读:
    Hadoop伪分布式环境安装
    记一次Xshell配置ssh免密登录时的问题
    HDFS学习笔记二
    HDFS学习笔记一
    十万级百万级数据量的Excel文件导入并写入数据库
    javascript内置对象:Date
    内置对象:Math
    javascript内置对象一:String
    javascript内置对象一: Array数组
    Javascritp 数据结构和二叉树算法
  • 原文地址:https://www.cnblogs.com/wen-ge/p/4230296.html
Copyright © 2011-2022 走看看