• const限定符


    本文整理了C++ Primer中对const的使用。

    1.const对象一旦创建后其值就不能改变,所以const对象必须初始化。

    1 const int i = get_size();        //正确
    2 const int j = 42;                //正确
    3 const int k;                     //错误,k没有初始化

    2.用来给const初始化的值是不是const类型都无关紧要。

    1 int i = 42;              
    2 const int ci = i;                 //用非const初始化const,正确
    3 int j = ci;              //const给非const赋值,正确

     

    3.默认状态下,const对象仅在文件内有效

    const是编译器在编译过程中,把用到该变量的地方替换成相对应的值。为了实现这个替换,编译器必须知道const变量的初始值。

    如果程序包含多个文件,则每个用了const对象都必须能访问到它的初始值才行。为了做到这一点,就必须在每一个用到该变量的文件中都有对它的定义。

    为了支持这一用法,同时避免对同一变量的重复定义,默认情况下const对象只在文件内有效,多个文件内出现了同名const对象时,知识不同文件中分别定义了独立的变量。

    如果需要在文件内共享,那么使用extern关键字。

    1 //file.cpp
    2 extern const int i = 3;
    3 
    4 //file.h
    5 extern const int i;

    在cpp文件内定义并且初始化了const的i,而头文件中知识对它声明,指明i并非是本文件独有,它的定义将在别处出现。

    4.const的引用(常量引用)

    (1)常量引用可以绑定常量,也可以绑定非常量。

    1 int i = 10;
    2 const int j = 20;
    3 const int &ii = i;              //常量引用可以绑定一个普通变量
    4 const int &jj = j;             //常量引用可以绑定一个常量对象

    当绑定一个普通变量时,不允许通过常量引用去修改变量的值,但是变量本身的值可以通过赋值、非常量引用等方式修改。如:

    1 int i =42;
    2 int &j = i;                                  //可以通过修改j来修改i
    3 const int &k = i;                           //不能通过修改k来修改i
    4 i = 24//可以通过直接赋值修改i

    (2)非常量引用不可以绑定一个常量对象

    1 const int i= 10;
    2 int &ii = i;                //错误,i是const,不可以被修改,而ii是非常量引用,不允许通过ii去修改i

    5.指针和const

    顶层const:表示指针本身是个常量。

    底层const:表示指针所指对象是个常量。

    例如:

    1 int i = 0;
    2 int *const p = &i;            //顶层const,指针本身是常量
    3 const int *p = &i;            //底层const,指针所指的变量是常量

    声明引用的都是底层const

    1 const int &j = i;            //底层const

    注意:当进行拷贝操作时,可以忽略顶层const,但是不可以忽略底层const!也就是说,拷贝的双方若有一个是底层const修饰,那么另外一个也必须有底层const修饰才可以。

    例如:

    1 const int *p = &i;            //底层const
    2 int *pp = p;                   //错误行为,pp并没有底层const
  • 相关阅读:
    leetcode@ [300] Longest Increasing Subsequence (记忆化搜索)
    leetcode@ [200] Number of Islands
    JMETER压力测试报错:JAVA.NET.BINDEXCEPTION: ADDRESS ALREADY IN USE: CONNECT
    压力测试报告模版
    Jmeter学习—004—使用代理录制脚本—HTTP代理服务器(APP、web皆可)
    怎么用fiddler抓APP的包
    Jmeter录制脚本过程及Could not create script recorder报错、您的连接不是私密连接报错
    Github使用说明 --整理者米米
    Anaconda详细安装使用教程
    运用MQTT-JMeter插件测试MQTT服务器性能
  • 原文地址:https://www.cnblogs.com/love-jelly-pig/p/8997268.html
Copyright © 2020-2023  润新知