在C ++中使用const数据成员

时间:2016-05-09 10:35:28

标签: c++ use-case

好吧,我知道C ++类中const数据成员的功能。

我想知道的是,在类中引入const数据成员的目的。为什么有人会在编写真实软件时使用它? const数据成员的实际使用情况是什么?

请给我一些真实的例子。

编辑: 我不是在询问tuple数据成员。 我要求一些真实的用例,其中每个对象对于相同的数据将具有不同的const值。

3 个答案:

答案 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吗?当然可以。但是,当您不想要时,您可能会意外更改nameconst的全部目的是防止此类事故发生。

然而,遗憾的是,你的班级将无法转让!

答案 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,因为它们不相关。