在C ++中定义类作用域常量的最佳方法

问题描述 投票:1回答:1

我需要在与类相关的cpp文件中使用一些常数,并且不会在其外部使用。

我想出了几种方法来做到这一点:

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

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中的前一个常量相比,此方法是声明此类范围常量的首选方法。再次,如果我错了,请纠正我

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

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

方法4:const(C ++ 11)中的非静态.h

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将很难维护。

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

c++ c++11 static const
1个回答
0
投票

对于普通的全局变量,const确实暗示着static(但请注意const char *f;不是const),因此带或不带static的#1确实相同。 (这确实是一个错误的功能,在很多变量出现之前都作为constexpr inline的模拟。)#2也是相同的(仅因为classes也可以在匿名名称空间中声明,但不能)声明为static)。

这些对派生类不是本质上]不好:它们将常量限制为源文件,该常量可以为任意数量的类定义方法。您也可以将它们放在.hpp文件中,尽管首选类成员是合理的。

对于#3,请注意,该变量不必在类定义中进行初始化

。这样做可以在包含标头的每个文件的常量表达式中使用它,在这种情况下,现代风格(支持非整数变量)将使用constexpr

#4和#5向每个类对象添加一个成员,最好避免-考虑它们禁用默认的assignment

运算符。
© www.soinside.com 2019 - 2024. All rights reserved.