初学者的C++11学习:constexpr修饰常量表达式

内容学习自b站:爱学习的大丙

1.和const的区别

const的双重语义:变量只读,修饰常量

const修饰对象无法修改,constexpr更侧重于修饰对象编译期确定且无法修改

2.在C++11中添加了一个新的关键字constexpr,这个关键字是用来修饰常量表达式的。所谓常量表达式,指的就是由多个(>1〕常量(值不会改变)组成并且在编译过程中就得到计算结果的表达式.

C++程序从编写完毕到执行分为四个阶段:预处理、编泽、汇编和链接四个阶段,得到可执行程序之后就可以运行了。常量表达式和非常量表达式的计算时机不同,非常量表达式只能在程序运行阶段计算出结果,但是常量表达式的计算往往发生在程序的编译阶段,这可以极大提高程序的执行效率,因为表达式只需要在编译阶段计算一次,节省了每次程序运行时都需要计算一次的时间.

编译器如何识别表达式是不是常量表达式呢?在C++11中添加了constexpr关键字之后就可以在程序中使用它来修饰常量表达式,用来提高程序的执行效率。在使用中建议将const和constexpr的功能区分开,即凡是表达“只读"语义的场景都使用const,表达常量”语义的场景都使用constexpr.

在定义常量时,const 和 constexpr是等价的,都可以在程序的编译阶段计算出结果,例如:

上述都为常量表达式;

但是要注意:如果存在内置数据例如结构体和类,那么不能直接用constexpr修饰这个结构体或类,或者函数;

这样a这里就报错了。

这样就可以了

2.常量表达式

为了提高c++程序执行效率,我们可以将程序中值不需要变化的变量定义为常量,所以可以使用constexpr修饰返回值。主要包含以下几种:普通函数,类成员函数,类构造函数,模板函数。

 2.1修饰函数

constexpr并不能修改任意函数的返回值的时候,这些函数变为常量表达式。所以必须满足以下条件:

2.11存在返回值,并且return返回的表达式必须是常量表达式。

2.12函数使用前必须要先声明。

2.13整个函数体中,不能出现非常量表达式之外的语句(suing,typedef,assert,return除外)因此常量表达式中for循环变为非法操作(i一直在变)。

3.修饰模板函数

C++11中,由于模板中参数的的不确定性,因此模板函数实例化后不一定符合constexpr的要求。如果不满足要求,constexpr会被自动忽略,相当于变为普通函数。

此处a为变量但是也能在constexpr下正常输出。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值