在学习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. SQL 中case when then else 用法

    SQL如下: SELECT DISTINCTsy_haken_type,sy_sagyo_type,sy_kokyaku_cdFROm tbl_syukeiWHERE (sy_sagyo_ymd be ...

  2. Nico Game Studio 3.地图纹理编辑 物体皮肤编辑

    完成功能: 1.地图纹理编辑功能. 图层编辑,添加/删除纹理,地图编辑.网格绘制.

  3. C#和SQL操作Xml

    #region DataTableToXml        public static string DataTableToXml(System.Data.DataTable Dt)        { ...

  4. AIX filesystemcache引发的Oracle事故

    链接地址: http://www.jydba.net/aix-filesystemcache%e5%bc%95%e5%8f%91%e7%9a%84oracle%e4%ba%8b%e6%95%85/ A ...

  5. C# CRC校验的一点感悟

    今天在鼓捣一个手持操作器的时候,遇到一点问题,记录一下今天的经验包 由于之前公司产品在校验时基本上都是和校验,今天在准备用C#模拟一个古董操作器的时候,却遇到一个问题,模拟器发出的数据,主板一律不回复 ...

  6. ES6学习笔记之Promise

    入职百度EFE团队实习已经三周了,实习中接触到了生产环境的技术和开发流程,大开眼界,和自己在学校接小作坊式项目是很不一样的体验.其中一个很大的感触是,ES6早已不是“选修”的尝鲜技术,而是已经全面普及 ...

  7. 三角网格(Triangle Mesh)的理解

    最简单的情形,多边形网格不过是一个多边形列表:三角网格就是全部由三角形组成的多边形网格.多边形和三角网格在图形学和建模中广泛使用,用来模拟复杂物体的表面,如建筑.车辆.人体,当然还有茶壶等.图14.1 ...

  8. mysql主要应用场景 转载

    前言 据说目前MySQL用户已经达千万级别了,其中不乏企业级用户.可以说是目前最为流行的开源数据库管理系统软件了.任何产品都不可能是万能的,也不可能适用于所有的应用场景.那么MySQL到底在什么场景下 ...

  9. CSS3—CSS3和现代Web设计

    1.1 现代Web设计理念 1.1.1 可访问性第一 同样一段内容, 可以用成千上万的方法为其设计样式, 但全世界的用户应该依然可以访问它们, 不管他们用什么方式去访问Web——无论手机.键盘控制器还 ...

  10. 策略模式(Strategy)

    行为型模式:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式 策略模式(Strategy) 策略模式定义了一系列算法,并将 ...