好吧,我知道C ++类中const数据成员的功能。
我想知道的是,在类中引入const数据成员的目的。为什么有人会在编写真实软件时使用它? const数据成员的实际使用情况是什么?
请给我一些真实的例子。
编辑:
我不是在询问tuple
数据成员。
我要求一些真实的用例,其中每个对象对于相同的数据将具有不同的const值。
答案 0 :(得分:2)
您使用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
的全部目的是防止此类事故发生。
然而,遗憾的是,你的班级将无法转让!
答案 1 :(得分:1)
有几种情况。最明显的一个是静态const数据成员。这些用作范围常量:
class Something {
static const int SOME_CONSTANT = 17;
};
请注意,在C ++ 11及更高版本中,constexpr
通常在这些情况下更有意义。
这定义了一个常量,该常量被输入并限定为类'实现。但我怀疑这不是你要问的。
更有趣的用例是针对类的实例之间不同的值,但在类的实例中是不变的。寿命。
例如,假设您有一个RAID实现,其中配置设置条带宽度。您在编译时不知道条带宽度,因此上述构造对您没有帮助。你确实希望宽度在整个班级中保持不变。但是生命周期(也许你的代码不知道如何处理条带宽度变化)。
在这些情况下,标记值const并在构造函数中设置它可以为您提供编译时保证没有人更改此值。
答案 2 :(得分:0)
您使用它与使用全局声明的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,因为它们不相关。