zoukankan      html  css  js  c++  java
  • const和constexpr修饰符

    1 const 对象必须初始化

     //error,const 对象必须初始化
     //const int num1;

    2 const修饰后值不能改变

     const int num = 100;
     //error,const 对象一旦创建就不能再改变
     //num = 1000;

    默认情况下,const对象仅在该文件内使用

    如果想在多个文件之间共享const对象,必须在变量的定义之前添加extern关键字

     //file_1.c定义并初始化了一个常量,该常量能被其他文件访问
     extern const int bufsize = 100;
     //file_2.h头文件
     extern const int bufsize;//与file_1.c中定义的bufsize是同一个

    3 const的引用

     const int ci = 1024;
     //正确,引用及其对应的对象都是常量
     const int &ri = ci;
     
     //错误,ri是对常量的引用,不能修改其值
     //ri = 42;
     
     //错误,试图让一个非常量引用指向一个常量对象
     //int &ri2 = ci;
     
     int i = 42;
     //允许一个常量引用指向一个非常量对象
     const int &ri3 = i;

     

    4 指向常量的指针

    指针指向的内存值不能改变,但可以使指针指向其他内存块

     const double pi = 3.14;
     //错误,pi是个常量,值不能被改变
     //double *ptr = π
     
     //正确,指向常量的指针不能用于改变其所指对象的值
     const double *cptr = π
     //错误,不能给*cptr赋值
     //*cptr = 42;

    5 常量指针

    指针指向不能改变,但指向的内存块值可以改变

     int errnum = 0;
     //正确,curerr是一个常量指针,curerr将一直指向errnum,不能改变指针的值
     int *const curerr = &errnum;
     int num = 100;
     //错误,不能改变指针的指向
     //curerr = #
     
     const double pi = 3.14;
     //错误,常量指针指向常量对象
     //double *const pip = π
     //pip是一个指向常量对象的常量指针
     const double *const pip = π

    constexpr 限定符

    常量表达式是指值不会改变并且在编译过程就能得到计算结果的表达式

    1 声明数组维数

     constexpr int size = 100;
     int arr[size] = { 0 };
     /*
      错误,函数调用在常量表达式中必须具有常量值
     const int func() {
      return 10;
     }
     
     int main()
     {
      int arr[func()];
     
     }
     */
     //正确,在编译期就确定了func计算出的值10而无需等到运行时再去计算。
     constexpr int func() {
      return 10;
     }
     
     int main()
     {
      int arr[func()];
     
     }

     

    2 constexpr函数

    • 任何声明,除了:

      • staticthread_local变量。

      • 没有初始化的变量声明。

    • 条件分支语句ifswitch

    • 所有的循环语句,包括基于范围的for循环。

    • 表达式可以改变一个对象的值,只需该对象的生命期在声明为constexpr的函数内部开始。包括对有constexpr声明的任何非const非静态成员函数的调用。

    goto仍然不允许在constexpr函数中出现。

     
  • 相关阅读:
    mysql数据库全局只读和会话只读问题解析
    git仓库管理笔录
    使用 keytool 生成安卓应用程序签名
    html标签种类很多,为什么不都用div?
    css不受高度限制实现文本超出隐藏并以省略号结束
    进程、单线程、多线程
    CentOS7防火墙firewalld设置
    js 浏览器上调试方法多样
    javascript中call()、apply()、bind()的用法终于理解
    将图标LOGO之类的图形图像转换成字体调用方法大全
  • 原文地址:https://www.cnblogs.com/LuckCoder/p/14257345.html
Copyright © 2011-2022 走看看