我需要在与类相关的cpp
文件中使用一些常数,并且不会在其外部使用。
我想出了几种方法来做到这一点:
static const
文件中的.cpp
static const int a = 100; // <<<
int Class::foo() const
{
return a + 10;
}
int Class::bar() const
{
return a - 10;
}
如果我做对了,我也可以省略static
关键字,因为const
在此上下文中自动表示内部链接。请如果我错了,请纠正我。
与上一个基本相同,但是:
namespace
{
const int a = 100;
}
我相信,与C ++ 11中的前一个常量相比,此方法是声明此类范围常量的首选方法。再次,如果我错了,请纠正我。
static const
文件中的.h
class Class
{
public:
int foo() const;
int bar() const;
protected:
static const int a = 100; // <<<
};
const
(C ++ 11)中的非静态.h
class Class
{
public:
int foo() const;
int bar() const;
protected:
const int a = 100; // <<<
};
或类似这样:const int a{100}
。我认为POD类型没有区别。再一次,如果我错了,请纠正我。
class Class
{
public:
Class() : a(100) {} // <<<
int foo() const;
int bar() const;
protected:
const int a;
};
我猜我不能使用方法1和2,因为如果我需要创建子类,它们将失败。
而且,如果有很多重载的构造函数,我认为方法5将很难维护。
尽管该问题可能被认为是基于观点的,但主要是我试图弄清这些方法的优缺点,并且可能还有其他可能的解决方案。
对于普通的全局变量,const
确实暗示着static
(但请注意const char *f;
不是const),因此带或不带static
的#1确实相同。 (这确实是一个错误的功能,在很多变量出现之前都作为constexpr inline
的模拟。)#2也是相同的(仅因为classes也可以在匿名名称空间中声明,但不能)声明为static
)。
这些对派生类不是本质上]不好:它们将常量限制为源文件,该常量可以为任意数量的类定义方法。您也可以将它们放在.hpp
文件中,尽管首选类成员是合理的。
对于#3,请注意,该变量不必在类定义中进行初始化
。这样做可以在包含标头的每个文件的常量表达式中使用它,在这种情况下,现代风格(支持非整数变量)将使用constexpr
。#4和#5向每个类对象添加一个成员,最好避免-考虑它们禁用默认的assignment
运算符。