0%

C++:constexpr

constexpr

1. constexpr

1.1 const

在C++11之前只有const关键字,从功能上来说这个关键字有双重语义:1.变量可读;2.修饰常量
void func(const int num)表示这个变量是可读的,但不是常量;
const int num=24表示这个变量是常量
注意:变量只读不等于常量
例:

1
2
3
4
const int &num=a;
num=b;//错误,b是一个常量的引用,所以b引用的变量是不能修改的
a=10;//但是const对于变量a是没有影响的,a值变了b值也就变了
//所以引用b是只读的,但不能保证它的值不可改变,也就是说它不是常量

1.2 constexpr

C++11的新关键字,作用:修饰常量表达式
常量表达式:由多个常量组成并且在编译过程中就得到计算结果的表达式

非常量表达式只能在程序运行阶段计算出结果
但是常量表达式的计算往往发生在程序的编译阶段,可以提高程序的执行效率,因为表达式只要在编译阶段计算一次,节省了每次程序运行时都需要计算一次的时间

编译器如何识别常量表达式?constexpr
constvsconstexpr:使用中建议区分开,const表达只读语义,constexpr表达常量
在定义常量时,constconstexpr是等价的,都可以在程序编译阶段计算出结果

2. 常量表达式函数

使用constexpr修饰函数的返回值,这种函数叫做常量表达式函数,主要包括:1.普通函数/成员函数;2.类的构造函数;3.模板函数

2.1 修饰普通函数/成员函数

常量表达式函数的几个条件:

  1. 函数必须有返回值,而且返回值必须是常量表达式
  2. 函数在使用前必须有对应的定义语句
  3. 整个函数的函数体中,不能出现非常量表达式之外的语句(using 指令、typedef 语句以及 static_assert 断言、return语句除外)

2.2 修饰模板函数

constexpr可以修饰函数模板,如果constexpr修饰的模板函数实例化结果不满足常量表达式函数的要求,则constexpr会被自动忽略,即该函数就等同于一个普通函数

2.3 修饰构造函数

如果想得到一个常量对象,也可以使用constexpr修饰构造函数——常量构造函数有一个要求:构造函数的函数体必须为空,并且必须采用初始化列表的方式为各个成员赋值
如果不这么做的话,当定义一个常量对象时会报错

1
2
3
4
5
6
7
8
9
10
class Student{
public:
Student(int age):age(age){}
int age;
};

int main(){
constexpr Student stu(12);
cout<<stu.age;
}