当我们使用 constexpr
修饰函数、变量和构造函数时,可以在编译时进行常量计算和优化。以下是一些示例来说明 constexpr
的用法:
- 常量函数(Constant Functions):
constexpr int square(int n) {
return n * n;
}
int main() {
constexpr int result = square(5); // 在编译时求值
static_assert(result == 25, "Incorrect result"); // 静态断言
return 0;
}
在这个例子中,square
函数被声明为 constexpr
,允许在编译时对其进行求值。函数 square
计算给定整数的平方,并返回结果。在 main
函数中,我们使用 constexpr
调用 square(5)
,并将结果赋值给 result
。由于该调用在编译期间就可以确定结果,所以它可以用作编译时常量。静态断言 (static_assert
) 确保结果为 25。
- 常量变量(Constant Variables):
constexpr int factorial(int n) {
if (n <= 1)
return 1;
else
return n * factorial(n - 1);
}
int main() {
constexpr int num = 5;
constexpr int fact = factorial(num); // 在编译时求值
return fact; // 编译时返回常量
}
在这个例子中,factorial
函数使用递归计算给定数字的阶乘,并返回结果。在 main
函数中,我们使用 constexpr
声明了常量变量 num
和 fact
。fact
在编译时通过调用 factorial
求值得到 120,因为传递给 factorial
的参数 num
是一个常量表达式。
constexpr
构造函数:
class Circle {
private:
constexpr static double pi = 3.14159;
double radius;
public:
constexpr Circle(double r) : radius(r) {}
constexpr double getArea() {
return pi * radius * radius;
}
};
int main() {
constexpr Circle c(2.0); // 编译时构造对象
constexpr double area = c.getArea(); // 在编译时求值
return 0;
}
在这个例子中,我们定义了一个 Circle
类,其中半径和 π 值(作为静态成员)是被声明为 constexpr
的。构造函数 Circle(double r)
被标记为 constexpr
,允许在编译时构造对象。成员函数 getArea()
也被标记为 constexpr
,可以在编译时求值。在 main
函数中,我们使用 constexpr
创建了常量对象 c
,并通过调用 getArea()
获取圆的面积,其计算在编译时进行。
这些示例说明了 constexpr
的用法,它使得在编译时进行常量计算和优化成为可能,提高了程序的性能和效率。请注意,constexpr
的使用有一些限制和规则,例如函数体内只能有一个返回语句、初始化表达式必须是常量表达式等。