在学习C++的过程中,经常被什么时候使用const、为什么使用const以及怎么使用const关键字这样的问题所困扰,以下是我对const的使用总结。

1、值替代

  使用#define的确单缺点,第一:没有类型信息,这就会隐藏一些很难发现的错误;

                     第二:如果只是想取某个class的专属常量地址,#define无法创建一个class的专属常量

                   第三:#define或许不被视为语言的一部分,这样会导致PI可能不会被编译器看见,以至于在运用此常量时会产生错误信息;

               第四:#define不能提供任何封装性

               第五:用#define定义一个函数,容易产生一些不可思议的错误

  关于const,第一:const仅在const被定义过的文件里才是可见的,而在连接时不能被其他编译单元看到;

         第二:如果用运行期间产生的值初始化一个变量而且知道在变量生命期内是不变的,则用const限定该变量是程序设计中的一个很好的做法

         第三:不能在编译期间使用const的值,因为编译器在编译期间不需要知道它存储的内容

         第四:C++中的const默认是内部连接,如果想更改为外部连接以便让另外一个文件可以对它引用,需要在前面定义成extern

            extern const int x=1;此时强制分配了内存

           如果只是声明,extern const int x;则意味着在别处进行了定义。

2、指针

  在指针中,const的位置不同,其代表的含义也就不同。

  A、关键字const在指针左边,表示被指物是常量。如:

    const int* u;

    int const* v;

  B、关键字const在指针右边,表示指针自身是常量,即这个指针不能指向其它东西,但所指的东西的值可以改变。如:

    int d=1;

    int* const w=&d;

  C、关键字const在指针两边,表示被指物和指针两者都是常量。

    int d=1;

    const int* const x=&d;

    int const* const x2=&d;

3、函数参数和返回值

  A、函数参数  

    如果函数参数是按值传递的,可以用指定参数是const的。在函数参数中使用const限定参数表示参数不能被改变。 

  B、返回值

    对于内建类型,按值返回一个内建类型时,应该去掉const;

    对于用户定义的类型,如果一个函数按值返回一个类对象为const时,那么这个函数的返回值不能被赋值,这个有点像只读属性。

4、类

  第一:类中const的初始化是在构造函数初始化列表,表里的初始化发生在构造函数的任何代码执行之前。

  第二:为了让类有编译期间的常量成员,需要使用static const,必须在static const定义的地方对它进行初始化。关键字static意味着不管类的对象被创建多少次,都只有一个实例。类中的一个常量成员,在该类的所有对象中它都一样。

    class A{

      static const int size=100;

      const string* b[size];

    }

  第三:两个成员函数如果只是常量性不同,可以被重载。

  第四:如果声明一个成员函数为const,则等于告诉编译器该成员函数可以为一个const对象所调用。如果想让成员函数按声明的方式去做,还需要在定义函数时重申const。

  第五:前面带const的函数声明,表示该函数的返回值为const。要实现函数的返回值为const,需要在函数的参数表后面放一个const。

  第六:在类声明里声明mutable,可以指定一个或多个数据成员在一个const对象里被改变。    

    class Z{

      int i;
      mutable int j;
    public:
      Z();
      void f() const;
    };
    Z::Z():i(),j(){}
    void Z::f() const{       i++;    //此时会报错,不能修改i
      j++;    //可以修改j
    }

  第七:按位const的意思是对象中的每个字节都是固定的,所以对象的每个位映像从不改变

     按逻辑const的意思是,虽然整个对象从概念上讲是不变的,但是可以以成员为单位改变。

  第八:构造函数和析构函数都不是const成员函数,因为它们在初始化和清除时,总是对对象做些修改。

  目前只总结了这么多,如果有漏的或不对的地方,希望大家指出,谢谢。

  

C++中关于const的思考的更多相关文章

  1. C++中的const

    一,C++中const的基本知识 1.C++中const的基本概念 1.const是定义常量的关键字,表示只读,不可以修改. 2.const在定义常量的时候必须要初始化,否则报错,因为常量无法修改,只 ...

  2. C++中的const关键字

    http://blog.csdn.net/eric_jo/article/details/4138548 C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,本人根据各方 ...

  3. C与C++中的const

    同样,有下面一段代码: #include <iostream> using namespace std; int main() { ; int *j = (int *) &i; * ...

  4. C++中加const与不加const的区别

    “常量”与“只读变量”的区别. 常量肯定是只读的,例如5, "abc",等,肯定是只读的,因为常量是被编译器放在内存中的只读区域,当然也就不能够去修改它. “只读变量”则是在内存中 ...

  5. 关于《Head First Python》一书中print_lol()函数的思考

    关于<Head First Python>一书中print_lol()函数的思考 在<Head First Python>第一章中,讲述到Python处理复杂数据(以电影数据列 ...

  6. C++笔记019:C++中的const修饰的是一个真正的常量

    原创笔记,转载请注明出处! 点击[关注],关注也是一种美德~ 程序一: 我们知道数组的下标不能为变量,必须是一个确定的值.在C语言中看程序: #define a 10 int main() { //第 ...

  7. C++中的const总结

    CONST 一.符号常量 声明: const 类型说明符 常量名 = 常量值: const float PI = 3.1415927; //可以交换const与float的位置 符号常量在声明时一定要 ...

  8. C和C++ 中的const

    C++中的const正常情况下是看成编译期的常量,编译器并不为const分配空间,只是在编译的时候将期值保存在名字表中,并在适当的时候折合在代码中.所以,以下代码: #include <iost ...

  9. c++中的const和volatile知识自我总结

    学习了下c++中的const关键字,总结如下. 1.const限制一个变量不能修改其内容,如果强行修改的话,如下面代码这样子,编译就会报错,“表达式必须是可修改的左值”. int main() { c ...

随机推荐

  1. 字符编码笔记:ASCII、Unicode、UTF-8、UTF-16、UCS、BOM、Endian

    转载:http://witmax.cn/character-encoding-notes.html 今天中午,我突然想搞清楚Unicode和UTF-8之间的关系,于是就开始在网上查资料. 结果,这个问 ...

  2. UDP,TCP理解。

    UDP: 面向无连接, 每个数据大小限制在64K内 因为面向无连接,所以就是不可靠协议. 将数据和源和谜底封装到数据包当中,不需要建立连接.速度快(就像送快递一样,管你在不可以先到你门口) 用处:聊天 ...

  3. linq按需查询

    将不确定变成确定~LINQ查询两种写法,性能没有影响,优化查询应该是“按需查询” 如果在linq中希望进行一对多的复合查询时,请直接在查询中使用join into,或者使用let 关键字,当然在建立实 ...

  4. maven 创建的符号连接命令

    E:\Joyplus\src\main\webapp\WEB-INF>mklink /d lib ..\..\..\.\..\target\ediHelperSuite-0.5\WEB-INF\ ...

  5. [uiview animation ...] 这个函数有多少没有认识的可能!翻盘效果 上下左右怎么翻都不怕

    1.自己还想着怎么3d 变形    让一个视图绕x/y 轴线翻转 就这么一句代码 [UIView transitionWithView:self.startButton duration:0.5 op ...

  6. React学习笔记(一) 基础知识

    现在最热门的前端框架有AngularJS.React.Bootstrap等.自从接触了ReactJS,ReactJs的虚拟DOM(Virtual DOM)和组件化的开发深深的吸引了我. React的基 ...

  7. IE6 兼容问题总结

    1 IE6,IE7下设置body{overflow:hidden;}失效Bug

  8. Nodejs简单验证码ccap安装

    首先要求: node npm 安装时如果提示npm-gyp失败,可进行如下操作: 确认python版本2.7+ 安装npm install ccap 如果失败,尝试npm install ccap@0 ...

  9. header("Location:login.php")

    header("Location:login.php")应该注意的几个问题  header("Location:")作为php的转向语句.其实在使用中,他有几点 ...

  10. js 的对象--如何定义一个对象

    通过var object={}  对象字面量,可以叫对象直接量来自定义一个对象 对象自面量是一个表达式,这个表达式的每次运算都创建并初始化一个新对象.每次计算对象字面量的时候,也都会计算他的每个属性值 ...