• 3. const


    一、const含义

    • 类型修饰符const是指常类型

    • 常类型的变量或对象的值不可以被更新,因此const对象创建时必须要初始化

    • const对象是编译期概念,编译器在编译过程中将用到该变量的地方都替换成相应的值

    二、const作用

    1. 可以定义常量:const in a = 10;
    2. 类型检查
      • const与#define宏定义的区别:
        • const常量具有类型,编译器可以进行安全检查;
        • #define宏定义没有数据类型,只是简单的字符串替换,不能进行安全检查
    3. 防止修改,起保护作用,增加程序的健壮性
    4. 可以节省空间,避免不必要的内存分配

    三、const对象默认为文件局部变量

    • 默认情况下,const对象被设定为仅在文件内有效,如果要在不同的程序文件中使用同一个const对象,则必须要显示声明extern,并初始化
    • 非const变量默认为extern,因此不需要显示声明
    • 多个文件之间共享const对象,那么不管是声明还是定义都可添加上extern关键字,这样就只需要定义一次即可
    // file_1.cpp
    // 定义并初始化了一个常量,该常量可以被其他文件访问
    extern const int bufSize = fcn();
    
    // file_2.h
    // 与file_1.cpp中定义的bufSize是同一个
    extern const int bufSize;
    
    // file_1.cpp定义并初始化了bufSize,因此显然是一个定义,加上了extern则可以被其他文件访问
    // file_2.h头文件中的声明也由extern做了限定,其作用是指明bufSize并非本文独有,它的定义将在别处出现
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    四、const的引用(常量引用)

    • 将引用绑定到const对象上
    • 引用的类型必须与其所引用的对象的类型一致
    • 常量引用可以绑定到一个普通的类型对象上,只是不能通过该常量引用修改绑定对象的值
    const int a = 10;
    const int &b = a;
    
    
    int c = 5;
    const int &d = c;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    五、指针与const

    5.1 指向常量的指针(pointer to const,const在*左侧)

    const int *p = &a;
    // 或者
    int const *p = &a;
    
    • 1
    • 2
    • 3
    • const修饰的是指针指向的对象类型,而不是指针本身
    const double pi = 3.14;		// pi是常量
    const double *p = π		// p可以指向一个双精度常量
    
    double *p2 = π	// 错误!!!p2是一个普通指针,不可以指向一个常量对象
    
    • 1
    • 2
    • 3
    • 4
    • 指向常量的指针可以指向一个非常量对象
    int a = 1;
    const int *p = &a;			// 不可以通过指针p来修改a的值
    
    • 1
    • 2
    • 常量指针指向可以修改(地址),但是指向的值不可以修改(地址保存的值)

    5.2 常量指针(const pointer,const在*右侧)

    int *const p = &a;
    
    • 1
    • const修饰的是指针本身
    • 常量指针必须要初始化,且该指针的值不能修改
    • 常量指针所指向的值可以通过非常量指针进行修改
    #include 
    using namespace std;
    
    int main() {
        int num = 0;
        int * const ptr = #  //const指针必须初始化!且const指针的值不能修改
        int * t = #			// 通过非常量指针对常量指针指向的值进行修改
        *t = 1;
        cout << *ptr << endl;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    5.3 顶层const

    • 顶层const(top-level const)表示指针本身是个常量
    • 底层const(low-level const)表示指针所指向的对象是个常量

    六、常量表达式和constexpr

    • 常量表达式(const expression)是指值不会改变并且在编译过程就能得到计算结果的表达式
    • 一个对象是否为常量表达式由它的数据类型和初始值共同决定
    const int max_files = 20;
    const int limit = max_files + 1;
    
    // 以上两条均为常量表达式
    
    • 1
    • 2
    • 3
    • 4
    • C++11新规,允许将变量声明为constexpr类型以便由编译器来验证变量的值是否是一个常量表达式
    • 声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化
  • 相关阅读:
    【语音识别】声学建模中基于树的状态绑定
    Unity3D 基础——通过四元数控制对象旋转
    5年测试工程师在公司被看轻,只因不会自动化测试...
    glibc2.35-通过tls_dtor_list劫持exit执行流程
    IO-Link通信工业RFID智能传感器|读写器在工业自动化领域的优势分析
    【Linux-进程状态】
    国产无线耳机什么牌子好?国产蓝牙耳机品质排行榜
    渗透测试——信息收集思路
    【MySQL】MySQL基础部分知识点
    阿里提前批(阿里云)一面30min
  • 原文地址:https://blog.csdn.net/weixin_41070687/article/details/126337042