常量表达式与const和constexpr

本文详细解释了常量表达式的概念及其在C++中的应用,包括如何使用const和constexpr声明常量,以及这些声明如何影响指针的特性。

是不是带const的都是常量表达式?

是不是不带const的都不是常量表达式?

1、    常量表达式(const expression)是指值不会改变且在编译过程中就能够得到计算结果的表达式。

const int max_files=10;                  //max_files是常量表达式。

const int limits=max_files+20;      //limits是常量表达式

int a=5;                                               //a不是常量表达式

const int sz=get_size();                   //sz不是常量表达式

因为变量sz的值知道程序运行时,才知道,所以sz不是常量表达式。

2、   constexpr变量

C++11新标准规定,允许将变量声明为constexpr类型以便由编译器来验证变量的值是否是一个常量表达式,声明为constexptr的变量一定是一个常量,而且必须用常量表达式来进行初始化。

constexpr int mf=40;                       //mf是一个常量表达式

constexpr int limit=mf+5;               //limit是一个常量表达式

constexpr int sz=size()+3;             //只有在size()函数为constexpr类型时,这个表达式才会有效,并且sz才会为常量表达式

一般来说,如果你认定变量是一个常量表达式,那就把它声明为constexpr类型。

 3、指针和constexpr

必须明确一点,在constexpr声明中如果定义一个指针,constexpr对指针有效,但对指针所指的对象无效,它的意思就是说,如果我们用constexpr声明一个指针,那么这个指针就是一个常量指针,这个指针的类型是常量,但是这个指针所指向的值(即等号右面的那个表达式)的类型我们就无从得知了。

const int *p=nullptr;                        //p是一个指向整型常量 的指针,即等号右侧的对象是常量型的,但是这个指针本身并不是常量型的

constexpr int *q=nullptr;                //q是一个指向整数的常量指针,即q本身是常量型的一旦初始化就不能够修改。但是它所指的对象的类型不知道。

与其它常量指针一样,constexpr指针就是常量指针,这个指针既可以指向常量也可以指向非常量,只要指向的这个对象有一个确切的值。

const expr int *np=nullptr;                   //这句等价于          int *const np=nullptr;          np是一个常量指针,它指向的值为空

int j=0;

constexpr int i=43;                                //i是一个常量型的整数且值为43

constexpr const int *p=&i;                   //p是一个常量指针,不仅p是常量型的,它指向的值也被声明为一个常量

constexpr int *p2=&j;                           //p是一个常量指针,指向一个整数,这个整数你不知它是否为常量型。

C++11 引入了 constexpr 关键字,用于指定函数或对象是常量表达式常量表达式是在编译时就能计算出结果的表达式,它可以用于数组大小、模板参数等需要在编译时确定的地方。 constexpr 函数 constexpr 函数是指能在编译时求值的函数,它的返回值可以作为常量表达式使用。constexpr 函数的参数返回值必须是字面类型。 例如,下面的函数就是一个 constexpr 函数: ```cpp constexpr int square(int x) { return x * x; } ``` 我们可以在编译时计算出 square(5) 的值,因此它是一个常量表达式constexpr 对象 constexpr 对象是指在编译时就能计算出值的对象。constexpr 对象必须被声明为 const,而且必须用常量表达式初始化。 例如,下面的语句定义了一个 constexpr 对象: ```cpp constexpr int max_num = 100; ``` 我们可以在编译时就知道 max_num 的值是 100,因此它是一个常量表达式constexpr 函数常量表达式的限制 constexpr 函数常量表达式有一些限制: 1. constexpr 函数必须有一个返回值,而且返回值必须是字面类型。 2. constexpr 函数的函数体必须足够简单,能在编译时被求值。 3. constexpr 函数不能包含任何副作用,比如修改全局变量或调用非 constexpr 函数。 4. constexpr 函数的参数返回值必须是字面类型。 5. constexpr 对象必须被声明为 const,而且必须用常量表达式初始化。 6. constexpr 对象的类型必须是字面类型。 总结 constexpr 关键字用于指定函数或对象是常量表达式constexpr 函数常量表达式必须在编译时就能计算出值,它们有一些限制。constexpr 函数常量表达式可以用于数组大小、模板参数等需要在编译时确定的地方。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值