C++中常量数据成员的用法

Usage of const data member in C++

本文关键字:用法 数据成员 常量 C++      更新时间:2023-10-16

好吧,我知道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放在这里吗?是的,当然。但你可能会在无意中意外更改nameconst的全部目的是防止此类事故的发生。

然而,遗憾的是,你的班级将无法分配!

有几种情况。最明显的是一个静态常量数据成员。这些被用作作用域常量:

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