C++ constexpr类

本文介绍了一个使用constexpr修饰的类A的实现方式。此类允许在构造函数中仅接收常量值作为参数,不允许使用变量。通过两个实例展示了如何正确地初始化此类,并强调了constexpr在C++中的用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 constexpr类.cpp

#include<iostream>

using namespace std;

//constexpr 类是指该类的构造函数被constexpr修饰后,其传递的参数不能是变量,只能是常量(只读变量,字面值)
class A{
	int a,b;
	public:
	A(){}
	constexpr A(int ra,int rb):a(ra),b(rb){}
	~A(){}
};

int main()
{
	int m=10,n=9;
    A a(m,n);
	A b(10,9);
	
}


在这里插入图片描述

### C++ 中 `constexpr` 的用法和特性 #### 编译时常量表达式 在 C++ 中,`constexpr` 关键字用于定义可以在编译期计算的常量表达式。这意味着使用 `constexpr` 定义的对象或函数的结果,在程序编译阶段就可以被确定下来[^1]。 ```cpp constexpr int max_value = 100; ``` 上述代码中的 `max_value` 是一个编译时常量,它的值是在编译期间就已知的。 #### 函数与变量声明 除了简单的数值外,还可以将更复杂的逻辑封装到 `constexpr` 函数里: ```cpp constexpr int add(int a, int b) { return a + b; } static_assert(add(2, 3) == 5); ``` 这里展示了如何创建能够在编译时执行加法运算并返回结果的 `constexpr` 函数。通过静态断言 (`static_assert`) 可验证该函数确实在编译器运行正常。 #### 型支持扩展 随着标准版本的发展,`constexpr` 支持的数据型逐渐增多。到了 C++20 版本之后,几乎所有的内置操作符都可以放在 `constexpr` 上下文中工作,甚至包括一些成员函数也可以标记为 `constexpr` 来实现更加灵活的功能[^2]。 例如下面的例子演示了一个简单结构体内的构造函数以及成员访问方法均能作为编译时期求值的一部分来调用: ```cpp struct Point { constexpr Point(double x, double y): _x(x), _y(y){}; constexpr double getX() const {return this->_x;} private: double _x,_y; }; // 使用场景 constexpr auto p = Point{1.0, 2.0}; static_assert(p.getX()==1.0,""); ``` 此段代码说明了即使对于自定义数据结构也能够利用 `constexpr` 实现高效的编译优化。 #### 初始化复杂对象 另一个重要的应用领域就是允许对较为复杂的对象进行编译时期的初始化。这不仅限于基本型的组合,还包括容器和其他 STL 组件等高级组件的支持。 ```cpp #include<vector> using namespace std; template<typename T> constexpr vector<T> make_vector(T... args){ return {args...}; } int main(){ constexpr auto vec=make_vector<int>(1,2,3,4,5); } ``` 这段代码片段表明即使是像向量这样的动态数组也能借助模板技巧配合 `constexpr` 达成完全意义上的即时构建效果。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值