C++中常量数据成员的用法
Usage of const data member in C++
好吧,我知道C++类中const数据成员的功能。
我想知道的是,在类中引入const数据成员的目的。为什么有人会在编写真正的软件时使用它?const数据成员的实际用途是什么?
请给我举几个现实生活中的例子,并说明原因。
编辑:我不是在询问static const
数据成员。我正在询问一些现实生活中的用例,其中对于相同的数据,每个对象都将具有不同的常量值。
使用const
数据成员的原因与使用任何const
对象的原因相同:用于可以任意初始化但永远不会更改的值。
一个很好的经验法则是"默认情况下"将某物表示为const
,这样您就可以想象在类中使用它的很多理由。
class User
{
User(const std::string& name)
: name(name)
{}
private:
/**
* User's name is an invariant for the lifetime of this object.
*/
const std::string name;
};
你能把const
放在这里吗?是的,当然。但你可能会在无意中意外更改name
。const
的全部目的是防止此类事故的发生。
然而,遗憾的是,你的班级将无法分配!
有几种情况。最明显的是一个静态常量数据成员。这些被用作作用域常量:
class Something {
static const int SOME_CONSTANT = 17;
};
请注意,在C++11及以后的版本中,constexpr
在这些情况下通常更有意义。
这定义了一个常量,该常量的类型和作用域为类的实现。不过,我怀疑这不是你要问的。
更有趣的用例是类实例之间的值不同,但在类的生存期内是恒定的。
例如,假设您有一个RAID实现,其中的配置设置了条带宽度。您在编译时不知道条带宽度,所以上面的构造对您没有帮助。但是,您确实希望宽度在类的整个生命周期中保持不变(也许您的代码不知道如何处理条带宽度的更改)。
在这些情况下,标记值const并在构造函数中设置它,可以在编译时保证没有人更改此值。
使用它与使用全局声明的const完全相同,只是希望它只应用于您在其中定义的类。例如
class Character
{
public:
Character()
:
mCurrentHealth{TOTAL_HEALTH},
mCurrentMana{TOTAL_MANA}
{
}
// Define lose/gain health/mana functions
// for mCurrentHealth and mCurrentMana
private:
int mCurrentHealth;
int mCurrentMana;
// Constants
const int TOTAL_HEALTH = 100;
const int TOTAL_MANA = 50;
};
还有许多其他示例,但主要的一点是,我们不希望在类之外定义TOTAL_HEALTH和TOTAL_MANA,因为它们不相关。
- 用于访问容器<T>数据成员的正确 API
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 数据成员SFINAE的C++17测试:gcc vs clang
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 如何在c++中定义以struct为数据成员的类中的构造函数
- 静态数据成员模板专用化的实例化点在哪里
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 使用指针访问数组中的对象数据成员
- 友元函数无法访问私有数据成员 (c++)
- 我可以在 C++ 中将数据成员/变量从其定义之外添加到结构中吗?
- 为什么将一个结构的引用设置为等于另一个结构只会更改一个数据成员?
- 将私有数据成员添加到野牛生成的类中
- 输入数据成员未按要求工作
- 二维矢量数据成员
- 在类 A 中创建类型为 B 类的向量 - 访问数据 [C++] [成员在两个类中都是私有的]
- 调用在 HXX 文件中声明的静态数据成员
- 是否可以根据其数据成员的类型确定类型的大小
- 将 PIMPL 习惯用法与成员函数模板一起使用(无需预先了解所有可能的数据类型)
- C++中常量数据成员的用法
- C++析构函数删除包含动态数组作为数据成员的对象时的用法