zoukankan      html  css  js  c++  java
  • const 和指针

    c++用了那么久,觉得 const 和指针配合到一起的时候就会有点点分不出来。

    如下:

    const Data* pData;
    
    Data const * pData
    
    Data * const pData
    
    const Data * const pData      
    
    Data const * const pData
    

      

    是不是有点晕?

    我其实用得最多的是 const Data* pData, 也理解该语句是定义 pData指向的对象是不允许修改的(不能通过pData指针调用非const方法)。

    那么Data * const pData 实际就是指针本身是不可修改的(你不能将该指针赋值成另一个地址)。

    实际上只会出现3中情况.

    一种修饰语义是将指针所指向的对象修饰为const.

    一种修饰予以是将指针本身(值类型)修饰为const, 本质上像你定义一个 const long 一样。

    最后一种是对象为const 同时指针也为const.

    那么,上面那一串代码都可以对号入座。

    简单的办法是:

    const 关键字出现在 * 前面, 修饰的是对象

    const 关键字出现在 * 后面, 修饰的是指针

    好了,再分析之前的例子:

    const Data* pData;               //修饰对象
    
    Data const * pData               //修饰对象
    
    Data * const pData               //修饰指针
    
    const Data * const pData              //修饰对象 + 指针
    
    Data const * const pData              //修饰对象 + 指针

    所以有那么多种写法,其实就是在*左边和右边的问题。

    我们应该始终按自己的风格选择一种固定模式就好。

    为什么const 出现在 * 左边是修饰对象而不是修饰指针

    而为什么const 出现在 * 右边是修饰指针而不是修饰对象

    要理解这个,需要先理解神射手理论

    说有一个神射手,随意的在枪靶上,每隔1cm的地方打了一个眼。

    这个枪靶上居住着一种二维生物。

    经过很多该生物的宇宙年后,该生物中的科学家终于发明了太空飞船,开始探索自己的宇宙。

    最后他们总结出他们的宇宙第一定律,就是每隔1cm的地方有个洞。

    哈哈, 我忘记我是在哪看到这个段子的了,是3T还是BigBang. 但是我在思考const 为啥放左边表示修饰对象的时候想起这个故事来着。

    不要在意这些细节,我真是一个很会自娱自乐的人。

  • 相关阅读:
    encog(二)神经网络的训练
    encog(一)
    JAVA基础知识总结14(String、StringBuffer、StringBuilder)
    JAVA基础知识总结13(同步)
    JAVA基础知识总结12(多线程)
    JAVA基础知识总结11(异常)
    JAVA基础知识总结10(包类)
    JAVA基础知识总结9(特殊类)
    JAVA基础知识总结8(设计模式)
    JAVA基础知识总结7(抽象类 | 接口)
  • 原文地址:https://www.cnblogs.com/BearOcean/p/4298227.html
Copyright © 2011-2022 走看看