码迷,mamicode.com
首页 > 其他好文 > 详细

const和constexpr修饰符

时间:2021-01-12 10:59:56      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:position   style   初始化   main   包括   静态成员函数   过程   调用   variable   

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函数中出现。

 

const和constexpr修饰符

标签:position   style   初始化   main   包括   静态成员函数   过程   调用   variable   

原文地址:https://www.cnblogs.com/LuckCoder/p/14257345.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!