静态常量 vs 常量静态

61

我不理解在我的C++类中这两种语句的区别:

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

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


4
也许阅读这个链接可能会帮助你更好地理解声明。链接地址为:http://c-faq.com/decl/spiral.anderson.html - Some programmer dude
4
@JoachimPileborg:我和其他人一样,不太相信“螺旋规则”。而且在这种情况下,它根本起不到任何帮助作用,因为无论是“螺旋”还是不是,“const”和“static”的顺序都不同。 - David Rodríguez - dribeas
@DavidRodríguez-dribeas 我同意。螺旋规则只有在声明非常简单时才有效,而此时你根本不需要它。否则,它最多是误导,最坏的情况下完全错误。 - James Kanze
4个回答

71

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

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

6.11.5 存储类说明符

1 在声明中除了在声明说明符的开始处之外放置存储类说明符是一种过时的特性。


50

staticconst(在这里)和类型(例如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修饰符必须跟在它们所修饰的内容后面;出于正交性的原因,你通常应该始终将cv修饰符放在它们所修改的内容之后(即 int const 而不是 const int)。

最后,似乎广泛使用的惯例是在类型前面加上类型修饰符,其中有符号修饰符(signedunsigned)在长度修饰符(shortlonglong long)之前。如果存在修饰符,则省略 int 是相当常见的做法,因此人们写 unsigned 而不是 unsigned int,写 long 而不是 long int。然而,这远非普遍惯例。

鉴于此,最好采用上面所述的第一种声明方式,尽管省略 int 也是完全可以接受的。


顺便问一下,你是不是想说“either”而不是“neither”? - BigBrownBear00
@user1054424 我在原始声明中漏掉了 int。如果没有至少一个类型名称,该声明将是非法的。但是有了 int,它应该是“两者之一”或“两者都”,而不是“两者都不”。 - James Kanze
我认为惯例是如果有长度修饰符,则省略 int,但如果只有符号修饰符,则不省略。也就是说,我看到的几乎所有代码都使用 unsigned int 而不是 unsigned - starblue
根据上下文,我会同时使用“unsigned int”和“unsigned”。如果我在声明成员变量时,我会使用“unsigned int”; 如果我将其声明为用于循环中数组或向量索引的计数器,则通常会使用“unsigned”。至于“static”,我通常会把它放在最前面。唯一不同意上述内容的是我不喜欢后面的“const”,这是出于个人喜好。当我阅读并查看我的代码“static const unsigned int”时,我知道它具有静态存储,是“常量”和“unsigned int”。用其他方式阅读对我来说是倒过来的。 - Francis Cugler

8

它们是相同的。但我通常会选择选项1,因为有一个简单的原因,即关键字 constint 更适合并排使用来定义数据类型。而关键字 static 则定义了该变量的可访问性。



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接