一、
常量表达式:是指值不会改变并且在编译过程就能得到的计算结果的表达式。
定义常量表达式变量:
constexpr 变量类型 变量名;
例如:
constexpr int mf=20;/////20是常量表达式
constexpr int limit=mf+1;/////mf+1是常量表达式
constexpr int sz=size();//////错误:size()只有到运行时才能获取到
二、
指针和引用都能定义为constexpr,但是他们的初始值却受到严格限制。一个constexpr指针的初始值必须是nullptr或者0,或者是存储于某个固定地址中的对象。
const int *p=nullptr;////p是一个指向整型常量的指针
constexpr int *q=nullptr;/////q是一个整数的常量指针
注意:p和q相差甚远,p是一个指向常量的指针,q是一个常量指针,其中关键在于constexpr把它所定义的对象置为了顶层const。
补充:顶层const指定义了一个常量指针,底层const指定义了一个指向常量的指针。
========================================
在定义一个指针时,可以添加一个constexpr关键字修饰,这样的指针称为constexpr指针;需要注意的是constexpr只对指针有效,与指针所指对象无关,这句话的意思是constexpr修饰的指针是一个指向变量的常对象,指针的方向不能改变,指向的对象可以改变
值得知道的一点是:constexpr指针时编译期常量,其指向定义时的初始值确定后不能发生改变,所以我们需要定义所有函数体之外的固定位置不变的,用来初始化constexpr指针,可以时全局变量,全局常量,静态变量等等
我们接下来可以用代码来表示:
#include <iostream>
using namespace std;
//指针与constexpr
int i = 10;//全局变量
constexpr int j = 10;//全局常量
int main01()
{
//int i=1;//无固定地址
constexpr int* p = &i;//初始化时需要取地址
i = 3;
//只要地址不变对指针的值就无影响
cout << "p指向的对象的值:" << *p << endl
<< "p指向的地址:" << p << endl;
//================
constexpr const int *q = &j;
cout << *q << endl;
static char x = 'X';//局部静态变量
constexpr char *m = &x;
cout << *m << endl;
system("pause");
return 0;
}
from:https://blog.csdn.net/m0_46434080/article/details/109138348
https://blog.csdn.net/aa6272737/article/details/125038354
https://www.cnblogs.com/cynthia-dcg/p/6057227.html
标签:const,定义,int,constexpr,指针,常量 From: https://www.cnblogs.com/im18620660608/p/17409195.html