zoukankan      html  css  js  c++  java
  • C++> const和constexpr区别与联系

    提到const和constexpr,就需要引入常量表达式。常量表达式是指值不会改变,并且编译过程就能得到计算结果的表达式。 => 编译阶段就能得到值,并且不能改变。

    const修饰对象无法修改,constexpr更侧重于修饰对象编译期确定且无法修改。具体区别,体现在以下两个方面:

    修饰变量

    const变量,表示一个变量无法改变,但初值并不确定,不能在编译阶段决定。
    比如,

    const int sz = get_size(); // 虽然sz无法改变,但get_size() 编译阶段无法确定值,也就是说sz不是常量表达式
    

    constexpr变量,编译器在编译阶段验证变量是否为一个常量表达式。
    constexpr侧重变量初值编译阶段确定,且无法修改。如果认定变量是一个常量表达式,就把它声明称constexpr类型。

    constexpr int mf = 20; // 字面量20是常量表达式
    constexpr int limit = mf + 1; // mf + 1是常量表达式
    constexpr int sz = size(); // 只有当size是constexpr函数时,才是正确的
    

    修饰指针

    const修饰指针分为两种情况:顶层const, 底层const。
    顶层const代表指针变量自身无法修改;底层const代表指针所指对象无法修改。

    int i = 10;
    int *const p1 = &i; // 顶层const
    const int *p2 = &i; // 底层const
    
    p1 = new int(20); // 错误,顶层const指针自身无法修改
    p2 = new int(30); // 正确,底层const指针可以修改
    *p1 = 40; // 正确,顶层const指针指向的对象可以修改
    *p2 = 40; // 错误,底层const指针指向的对象无法修改
    

    constexpr修饰指针,仅对指针有效,与指针所指对象无关

    // j的定义必须放在函数体外
    int j = 30;
    
    // 函数体内
    constexpr int *pp1 = &j; // 等价于 int constexpr *pp1 = &j;
    cout << *pp1 << endl; // 30
    *pp1 = 40;
    cout << j << endl; // 40
    pp1 = nullptr; // 错误,constexpr指针无法修改
    

    修饰函数

    const修饰成员函数,通常称为const函数,表示该函数不会修改类的状态(即不会通过任何方式修改类数据成员)。另外,const类对象,只能调用const函数,确保不会修改类的数据成员。
    constexpr无法修饰成员函数,只能作为函数返回值类型,表明该函数返回的是一个编译期可确定的常量。。

    参见C++的const类成员函数

    class A{
    public:
      A():curSize(10) {}
      int size() const { return curSize; }  // 不能写任何数据成员
      const int size() { return curSize; }  // 函数体可以修改数据成员,但返回类型是const,也就是调用者无法修改
      constexpr int getMaxSize() { return INT_MAX; } // 不能返回非常量值
    
    private:
      int curSize;
    }
    
  • 相关阅读:
    Java实现调用API识别图像中的文字并对图片重命名
    推荐大家一个人工智能领域安全信息学方向旗舰会议(EI索引),诚邀广大学子投稿!
    python随笔 1
    Neo4j
    Web项目部署到tomcat外部并配置其他端口访问和无项目名
    springboot项目
    解决找不到参数 问题,MyBatisSystemException
    置顶功能 -- 数据表格的某行数据的置顶功能 -- Demo
    Spring-Task定时任务, (springboot项目, 动态设置时间) -- Demo
    BootStrap-table表格 -- Demo
  • 原文地址:https://www.cnblogs.com/fortunely/p/14550145.html
Copyright © 2011-2022 走看看