【发布时间】:2020-04-22 15:11:07
【问题描述】:
我需要在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 在此上下文中自动暗示内部链接。
如果我错了,请纠正我。
方法 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:.h中的非静态const (C++11)
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将很难维护。
虽然这个问题可能被认为是基于意见的,但我主要是想弄清楚这些方法的优缺点,可能还有其他一些可能的解决方案。
【问题讨论】:
-
在 #4 和 #5 中,您将班级规模至少增加
sizeof(int)。 -
我认为#3 最适合您的用例。但在我看来,将其设为
static constexpr会更好。 -
使用最适合您当前情况的那个 (#2),如果您将来需要,可以更改它。除了真正微不足道的问题外,没有任何“理想的现在、永远和永远”的解决方案。
-
是否允许子类改变这个常量的值?
-
#1 & #2 是相同的,不能被认为是“类作用域”——它可以从同一个文件中的任何地方访问。
标签: c++ c++11 static constants