C++之const关键字

本文引自http://www.cnblogs.com/lichkingct/archive/2009/04/21/1440848.html ,略有增删

const关键字在c++中用法有很多,总结如下:

  1. 修饰变量和指针:
    • 修饰变量时把变量转换为常量,定以后不能修改,定义时就要初始化。含义是const修饰的变量varName时只读的,不可改变。格式如下:
      TYPE const varName=value;
      const TYPE varName=value;(推荐写法)
      试图定义一个非const对象的指针指向一个常量对象将会导致编译错误.
      const double minWage= 9.60;
      double *ptr=&minWage  //引起编译错误
      const double *ptr=&minWage //编译正确
    • 修饰指针时,const在不同的位置含义不同,记忆的方法:const在*前则可认为const修饰的是解指针的值,即内容不可变,const在*后则可认为const修饰的是指针,即指向的地址不可变
      const char* ptr="abc"; //*ptr不可变,ptr可变,即指针指向的内容不可变,而指针可以指向其他位置
      char const *ptr="abc";//同上
      
      char *const ptr="abc" //ptr不可变,*ptr可变,即指针指向的地址不能变,地址中存放的数据可以边
      const char* const ptr="abc"//两者都不可变
  2. const修饰函数参数:表示函数体中不能修改参数的值
  3. const修饰类对象/对象指针/对象引用:表示对象,对象指针和对象引用中的任何成员都不能被改变,且只能调用const成员函数。const修饰类成员变量:表示成员常量,它只能在初始化列表中赋值
  4. class Base
    {
    ...const int value;
    
    ....A(intx):value(x){}//在成员初始化列表中初始化const常量
    };
  5. const修饰类成员函数:该成员函数不能修改类中任何成员变量,且只能调用const成员函数
    class Base
    {
    void function()const; //常成员函数, 它不改变对象的成员变量. 也不能调用类中任何非const成员函数
    
    }
  6. const常量与defin宏定义的区别
    • 编译器处理方式不同:
      • define宏在预处理阶段展开
      • const常量在编译运行阶段使用
    • 类型和安全检查不同
      • define宏没有类型,不做任何类型检查,仅仅展开
      • const常量具有具体的类型,在编译价额段执行类型检查
    • 存储方式不同
      • define宏仅仅是展开,在哪个地方使用就在哪个地方展开
      • const常量在内存中分配
原文地址:https://www.cnblogs.com/phenixyu/p/4245009.html