在C++中定义类范围常量的最佳方法

4

我需要在一个与类相关且不会在类外部使用的cpp文件中使用一些常量值。

我想到了几种方法:

方法1:.cpp文件中的static const

static const int a = 100; // <<<

int Class::foo() const
{
    return a + 10;
}

int Class::bar() const
{
    return a - 10;
}

如果我理解正确,我也可以省略static关键字,因为在这种情况下const自动暗示了内部链接。
如果我理解有误,请纠正我

方法2:匿名命名空间(C++11)

基本上和之前的方法一样,但是:

namespace
{
    const int a = 100;
}

我相信这种方法是在C++11之前声明此类作用域常量的首选方式。
如果我错了,请再次纠正我。

方法三:.h文件中的static const

class Class
{
public:
    int foo() const;
    int bar() const;
protected:
    static const int a = 100; // <<<
};

Method 4: non-static const in .h (C++11)

class Class
{
public:
    int foo() const;
    int bar() const;
protected:
    const int a = 100; // <<<
};

或者像这样:const int a{100}。我认为对于POD类型没有区别。
再次强调,如果我说错了,请纠正我。

方法5:初始化列表

class Class
{
public:
    Class() : a(100) {} // <<<
    int foo() const;
    int bar() const;
protected:
    const int a;
};

总结

我认为不应该使用方法1和2,因为如果我需要创建子类,它们将失败。

此外,如果有许多重载的构造函数,我认为方法5将很难维护。

虽然这个问题可能被认为是基于观点的,但主要是我试图弄清楚这些方法的优缺点,可能还有其他可能的解决方案。


2
在#4和#5中,您至少通过sizeof(int)增加了类的大小。 - undefined
1
我认为第3种对于你的用例来说是最好的选择。但是在我的观点中,将其设为static constexpr会更好。 - undefined
1
使用适合当前情况的方法(第二种),并在将来需要时进行更改。除了真正琐碎的问题外,没有任何“现在和永远”的理想解决方案。 - undefined
子类可以更改这个常量的值吗? - undefined
#1和#2是相同的,不能被视为“类作用域”,它可以在同一文件中的任何地方访问。 - undefined
显示剩余2条评论
1个回答

3
对于普通全局变量,const确实意味着static(但请注意const char *f;不是常量),因此无论是否使用static,#1都是相同的。(这实际上是一个错误的特性,在变量可以拥有constexpr inline很多年之前就包含了它。)#2也是相同的(仅在匿名命名空间中可以声明类,但不能声明为static)。对于派生类来说,它们并非本质上的坏处:它们将常量限制在源文件中,该文件可以为您喜欢的少数或众多类定义方法。您还可以将它们放在.hpp文件中,尽管首选类成员是合理的。对于#3,请注意类定义中的变量不需要初始化。这样做可以使它在包含头文件的每个文件中用于常量表达式,在这种情况下,现代风格(支持非整数变量)是使用constexpr。#4和#5向每个类对象添加一个成员,最好避免使用-请考虑它们禁用默认赋值运算符。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接