C++作业疑问:constexpr成员变量为何需实现setter与getter?
理清constexpr成员与可修改上下界的关系
你这里的核心困惑应该是把作为“无界标记”的constexpr常量和可动态调整的上下界变量搞混了——constexpr变量确实是编译期确定的不可修改常量,但作业要求的kUnboundLower和kUnboundUpper并不是让你把它们当成可变动的上下界来用,而是作为一个固定的“无界状态标识”,真正需要setter/getter的是另一个可修改的成员变量。
正确的实现思路
- constexpr成员的定位:把
kUnboundLower和kUnboundUpper设为类的静态constexpr常量,用来表示“没有设置上下界”的状态,比如用对应数值类型的极值(比如int的INT_MIN/INT_MAX)。 - 可修改的上下界存储:在类里定义普通的成员变量(比如
m_lower、m_upper),用来保存用户实际设置的上下界值,这些变量是可以动态修改的,对应的setter/getter就是操作它们。 - 状态判断辅助:可以加几个辅助方法,判断当前是否设置了有效上下界(比如对比是否等于无界标记值)。
代码示例
#include <limits> template<typename T> class BoundedRange { public: // 编译期常量:表示"无界"的标记值 static constexpr T kUnboundLower = std::numeric_limits<T>::lowest(); static constexpr T kUnboundUpper = std::numeric_limits<T>::max(); // 构造函数默认初始化无界状态 BoundedRange() : m_currentLower(kUnboundLower), m_currentUpper(kUnboundUpper) {} // Getter:返回当前的上下界值 T getLowerBound() const noexcept { return m_currentLower; } T getUpperBound() const noexcept { return m_currentUpper; } // Setter:修改上下界,也可以传入无界标记值重置为无界 void setLowerBound(T newLower) noexcept { m_currentLower = newLower; } void setUpperBound(T newUpper) noexcept { m_currentUpper = newUpper; } // 辅助方法:判断是否处于有界状态 bool hasValidLowerBound() const noexcept { return m_currentLower != kUnboundLower; } bool hasValidUpperBound() const noexcept { return m_currentUpper != kUnboundUpper; } private: // 存储实际上下界的可修改成员 T m_currentLower; T m_currentUpper; };
关键要点说明
- constexpr静态成员在C++17及以后可以直接在类内初始化,如果你用的是更早的标准,需要在类外补充定义(比如
template<typename T> constexpr T BoundedRange<T>::kUnboundLower = std::numeric_limits<T>::lowest();)。 kUnboundLower和kUnboundUpper是编译期就能确定的固定值,所以适合用constexpr,你甚至可以在编译期用它们做条件判断(比如模板特化、静态断言)。- 真正接收用户设置的是
m_currentLower和m_currentUpper,它们是普通成员变量,完全支持动态修改,这也是setter/getter的作用对象。
内容的提问来源于stack exchange,提问作者Jared
相关产品推荐
相关产品推荐

