C++之常量表达式和 constexpr

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

字面值和用常量表达式初始化的const对象也是常量表达式。

const int mar_files = 20; //常量表达式
const int limit = mar_files +1 ; //常量表达式
int staff_size = 27 ; //这是一个普通的Int型数据,不是常量表达式
const int sz = get_size(); //这不是一个常量表达式,因这sz的值要到具体运行时才能够得到,而常量表达式的值是要在编译过程中就能得到,所以它不是一个常量表达式

constxpr变量:

C++11新标准:允许将变量声明为constexpr类型方便编译器来验证变量的值是否是一个常量表达式。

当我们把变量声明为constexpr的时候,它一定是一个常量,而且必须用常量表达式初始化它。

constexpr int mf = 20 ; //20是一个常量表达式
constexpr int limit = mf+1 ; //mf +1是一个常量表达式
constexpr int sz = size(); //只有当size函数是一个constexpr函数的时候才是正确声明语句。

在新标准下允许定义一种特殊的constexpr函数,这种函数不能太过于复杂,应该足够简单,在编译时就能得到计算结果,就可以用constexpr去初始化constexpr变量了。

#include "iostream"
using namespace std;
constexpr int SUM();//声明constexpr函数
int main() {
    constexpr int num = 0;
    int  num1 = SUM();
    constexpr int num2 = SUM();//正确的,因为SUM()是一个constexpr函数,并且它也足够简单
}
constexpr int SUM() {//定义constexpr函数
    return 2;
}

建议:如果你认定变量是一个常量表达式,就把它声明成constexpr类型。

字面值类型:

一般比较简,值也显而易见、容易得到的类型就可以称为是字面值类型。

算术类型,引用和指针都属于字面值类型。IO库、string类型则不属于字面值类型,也不能被宝岛成constexpr。

尽管指针的和引用都能被定义成constexpr,但它们的初始值却受到严格限制。一个constexpr指针的初始值必须是nullptr或者0,或者是存储某个固定地址中的对象。

如果在constexpr声明中定义了一个指针,限定符constexpr仅对指针有效,和它所指的对象无关。

const int *p = nullptr;     //P是一个指向整形常量的指针
constexpr int *q = nullprt; //q是一个指向整数的常量指针

constexpr把它所定义的对象置为了顶层const。和其他常量指针相同,constexpr指针既可以指向常量也可以指向一个非常量。

给一个练习题大家做一做:

//下面的语句是否合法,若不合法请修改:
int null=0 , *p = null;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
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 函数和常量表达式可以用于数组大小、模板参数等需要在编译时确定的地方。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

syhk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值