zoukankan      html  css  js  c++  java
  • 顶层const和底层const

    const与指针

    const和指针会形成2种不同性质的组合形式:const修饰指针本身const修饰指针指向的那个内存数据。在《C++ Primer》一书中作者使用顶层const和底层const这2个术语来描述这2种情况。前者就是所谓的顶层const,而后者就是底层const。下面用代码列举了这些情况:

    int main(int argc, char *argv[])
    {
    
        int a = 1;
    
        const int*p1 = &a; //p1是底层const,通过p1不能改变p1指向的数据a。p1本身可变。
        int const*p2 = &a; //同上,p2是底层const,通过p2不能改变p2指向的数据a。p2本身可变。
        
        //--------------------
        int* const p3 = &a; //p3是顶层const,p3本身不能改变,始终指向a,但是通过p3可以改变a的值
        
        //--------------------
        const int* const p4 = &a; //顶层const和底层const的结合。p4本身是const,且通过p4无法改变它指向的数据a
        int const* const p5 = &a; //同上
        
        //-------------------- 
        
        typedef int* pint_t;    //使用typedef将int*包装为一个简单类型 pint_t 
        
        const pint_t p6 = &a;   //const修饰p6,是顶层const 
        pint_t const p7 = &a;   //同上 
        
        //------C++11中的using类型别名-------------- 
        using pchar_t = char*;   //typedef包装类型别名的另一种替代方法 
        char c = 'A';
        const pchar_t p8 = &c;   //const修饰p8,是顶层const 
        pchar_t const p9 = &c;   //同上 
        
        return 0;
    }

    如何区分顶层const和底层const?

    我总结的技巧,分享一下。

    • 如果const后面紧跟着的是一个简单类型,则跳过这个简单类型,修饰后面的数据。(简单类型是指非复合类型,如int,class以及typedef,using包装后的类型等)
    • 如果const后面就是一个数据,则直接修饰这个数据。

    当在一个定义中同时出现顶层const和底层cosnt时,我们可以不看其中一个const从而方便给另一个const定性,同样也是使用上述技巧。

  • 相关阅读:
    jQuery常用事件,each循环,引用当前时间
    jQuery查找标签和操作标签
    PhaseScorer:感慨高手写的代码就是精炼
    遍历倒排索引核心类:SegmentTermDocs/SegmentTermPositions
    Lucene搜索核心代码TermInfosReader
    Lucene BooleanQuery相关算法
    Lucene搜索/索引过程笔记
    Lucene queryParser和analysis有什么不同?
    Lucene为什么要加Segment概念
    Lucene 写入一个文档到该文档可搜索延迟是多少?
  • 原文地址:https://www.cnblogs.com/lulipro/p/10152750.html
Copyright © 2011-2022 走看看