56

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

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

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

4

4 回答 4

68

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

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

6.11.5 存储类说明符

1 将存储类说明符放置在声明中声明说明符的开头以外的位置已过时。

于 2012-08-17T12:41:39.167 回答
45

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 (andextern等) 放在开头。

还要注意,无序仅适用于声明说明符。在随后的声明符中,cv-qualifier(s)必须遵循它们所限定的;出于正交性的原因,您通常应该始终将 cv 限定符放在它们修改的内容之后(即int const,而不是const int)。

最后,在类型之前显示类型修饰符似乎是一种普遍的约定,在长度修饰符(signedunsigned)之前带有符号修饰符shortlonglong long)。int删除if 修饰符也相当频繁,所以人们写unsigned, 而不是unsigned int, 和 long, 而不是long int。然而,这远非普遍。

鉴于此,上面的声明的第一种编写方式是首选,尽管删除int.

于 2012-08-17T12:57:32.000 回答
7

他们是一样的。但我总是会选择选项 1,原因很简单,即当它们定义数据类型时,它们并列时更适合关键字const和拟合。int其中关键字static定义了该变量的可访问性。

于 2012-08-17T12:52:26.693 回答
3

他们是一样的。请参阅此讨论:http ://bytes.com/topic/c/answers/140177-const-static-vs-static-const

于 2012-08-17T12:43:26.010 回答