静态常量与常量静态

问题描述 投票:0回答:4

我不明白我的 C++ 类中这两个语句之间的区别:

class MyClass {
  public:
  private:
     static const int var = 0;            // Option 1
     const static int var = 0;            // Option 2
};

选项 1 和选项 2 有什么区别?他们都编译。

c++ class constants
4个回答
72
投票

它们的意思完全相同。您可以自由选择您认为更容易阅读的内容。

在 C 中,您应该

static
放在开头,但这还不是必需的。我不确定 C++ 在这方面是否遵循 C。

6.11.5 存储类说明符

1 存储类说明符放置在声明开头以外的位置 声明中的说明符是一个过时的功能。


51
投票

static
const
(无论如何)和类型(例如
int
)都是一部分 声明说明符的。 历史上,声明说明符 是关键字和类型名称的无序列表,因此:

static unsigned int const var;
static unsigned const int var;
static int unsigned const var;
static int const unsigned var;
static const unsigned int var;
static const int unsigned var;
unsigned static int const var;
unsigned static const int var;
unsigned int static const var;
unsigned int const static var;
unsigned const static int var;
unsigned const int static var;
int static unsigned const var;
int static const unsigned var;
int unsigned static const var;
int unsigned const static var;
int const static unsigned var;
int const unsigned static var;
const static unsigned int var;
const static int unsigned var;
const unsigned static int var;
const unsigned int static var;
const int static unsigned var;
const int unsigned static var;

都是合法的,并且都意味着同样的事情。

我认为在 C 和 C++ 中情况仍然如此,但如果我 没有错,C 已弃用放置存储类说明符 (

static
)除了开头之外的任何地方。无论如何,这都是一个 几乎通用约定,所以你通常应该把
static
(以及
extern
等)在开始时。

还要注意,无序仅适用于声明说明符。 在随后的声明符中,cv 限定符必须遵循 他们有什么资格;出于正交性的原因,您通常应该 始终将简历限定符放在其修改内容之后(即

int const
, 而不是
const int
)。

最后,呈现类型似乎是一种普遍的惯例 类型之前的修饰符,带有符号修饰符(

signed
unsigned
)位于长度修饰符(
short
long
long
long
)之前。如果修饰符是,则删除
int
的情况也相当频繁。 存在,所以人们写
unsigned
,而不是
unsigned int
,并且
long
,而不是
long int
。然而,这远非普遍。

鉴于此,上面声明的第一种编写方式是 首选,尽管放弃

int
是完全可以接受的。


8
投票

它们是一样的。但我总是会选择选项 1,原因很简单,关键字

const
int
在定义数据类型时并置时更适合。其中关键字
static
定义了该变量的可访问性。


3
投票
© www.soinside.com 2019 - 2024. All rights reserved.