constexpr
1. constexpr
1.1 const
在C++11之前只有const
关键字,从功能上来说这个关键字有双重语义:1.变量可读;2.修饰常量void func(const int num)
表示这个变量是可读的,但不是常量;const int num=24
表示这个变量是常量
注意:变量只读不等于常量
例:
1 | const int &num=a; |
1.2 constexpr
C++11的新关键字,作用:修饰常量表达式
常量表达式:由多个常量组成并且在编译过程中就得到计算结果的表达式
非常量表达式只能在程序运行阶段计算出结果
但是常量表达式的计算往往发生在程序的编译阶段,可以提高程序的执行效率,因为表达式只要在编译阶段计算一次,节省了每次程序运行时都需要计算一次的时间
编译器如何识别常量表达式?constexpr
const
vsconstexpr
:使用中建议区分开,const
表达只读语义,constexpr
表达常量
在定义常量时,const
和constexpr
是等价的,都可以在程序编译阶段计算出结果
2. 常量表达式函数
使用constexpr
修饰函数的返回值,这种函数叫做常量表达式函数,主要包括:1.普通函数/成员函数;2.类的构造函数;3.模板函数
2.1 修饰普通函数/成员函数
常量表达式函数的几个条件:
- 函数必须有返回值,而且返回值必须是常量表达式
- 函数在使用前必须有对应的定义语句
- 整个函数的函数体中,不能出现非常量表达式之外的语句(using 指令、typedef 语句以及 static_assert 断言、return语句除外)
2.2 修饰模板函数
constexpr
可以修饰函数模板,如果constexpr
修饰的模板函数实例化结果不满足常量表达式函数的要求,则constexpr
会被自动忽略,即该函数就等同于一个普通函数
2.3 修饰构造函数
如果想得到一个常量对象,也可以使用constexpr
修饰构造函数——常量构造函数有一个要求:构造函数的函数体必须为空,并且必须采用初始化列表的方式为各个成员赋值
如果不这么做的话,当定义一个常量对象时会报错
1 | class Student{ |